存储过程与存储函数的具体区别和使用场景
1.创建存储过程:
create or replace procedure queryimg(pstu_id in number,
pstuname out varchar2,
page out varchar2,
pclassid out varchar2) as
begin
select t.stuname,t.age,t.classid into pstuname,page,pclassid from zhaozy.student t where stuid = pstu_id;
end;
2.调用:
declare
pstu_id varchar2(256);
pstuname varchar2(256);
page varchar2(256);
pclassid varchar2(256);
begin
pstu_id := 1;
queryimg(pstu_id => pstu_id,
pstuname => pstuname,
page => page,
pclassid => pclassid);
dbms_output.put_line('pstuname=' || pstuname);
-- :pstuname := pstuname;
dbms_output.put_line('page=' || page);
-- :page := page;
dbms_output.put_line('pclassid=' || pclassid);
-- :pclassid := pclassid;
end;
3.疑问:
:page := page;这里冒号什么作用?
加上之后报错:“ORA-01008 并非所有变量都已绑定”
如果去掉冒号就不会报错,但是输出结果和删除这一句是一样的。
int和out参数
过程和函数都可以通过ot指定一个输出参数,
----注意:一般情况下,返回值只有一个,用存储函数;否则,当没有返回值,或者返回值有多个,则使用存储过程
in和out参数(输入输出参数)
----out参数:查询某个员工的姓名 月薪和职位
create or replace procedure queryempinform(eno in number,pename out varchar2,psal out number,pjob out varchar2)
as
begin
---得到该员工的姓名 月薪和职位
select ename,empjob into pename,psal,pjob from emp where empno=eno;
end;
/
输出参数可以用作返回值一样返回给调用的客户端
如果只有一个返回值就是用存储函数,如果没有返回值或者有多个返回值就使用存储过程。
--out参数:查询某个员工的姓名,月薪,职位 /* 因为有多个返回值,所以使用存储过程。*/ create or replace procedure queryempinform(eno in number, pename out varchar2, psal out int, pempjob out varchar2)as begin --得到该员工的姓名,月薪和职位 select ename,sal,empjob into pename,psal,pempjob from emp where empno=eno; end; /
过程和函数都可以通过out指定一个或多个输出参数,
存储过程和存储函数都可以有out参数
存储过程和存储函数都可以有多个out参数
存储过程可以通过out参数来实现返回值
原则:如果只有一个返回值,用存储函数,否则,用存储过程。
执行
执行
函数和过程的选择取决于多少个返回值
--out参数:查询某个员工的姓名,月薪,职位 /* 因为有多个返回值,所以使用存储过程。 */ create or replace procedure queryempinform(eno in number, pename out varchar2, psal out int, pempjob out varchar2) as begin --得到该员工的姓名,月薪和职位 select ename,sal,empjob into pename,psal,pempjob from emp where empno=eno; end; /
什么时候用存储过程/存储函数?