如果只有一个返回值就用存储函数,否则,就用存储过程
存储过程存储函数都是存储在数据库中供所有用户程序调用的子程序。他们的区别就在于是否用return 语句返回值
存储过程:
--创建一个带参数的存储过程
--给指定的员工涨100块的工资,并且打印涨前和涨后的工资
CREATE OR REPLACE PROCEDURE SALARY (inno IN NUMBER,inzhang in number,zongshu out number )
AS
PSAL EMP.SAL%TYPE;--定义一个变量存储涨前的薪资
BEGIN
select sal into psal from emp where no = inno;--得到员工涨工资前的
update emp set sal = sal+ inzhang where no = inno;--给员工涨工资
commit;
select sal into zongshu from emp where no = inno;
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+inzhang));
END;
调用该存储过程:
declare
inno number;
inzhang number;
zongshu number;
begin
inno :=3;
inzhang :=10;
salary(inno,inzhang,zongshu);
end;
存储函数:
语法:CREATE OR REPLACE FUNCTION 函数名(参数列表)
return 函数值类型;
as
PLSQL子程序体;
--存储函数:查询某个员工的年收入
CREATE OR REPLACE FUNCTION CHAXUN(inno in number)
return number
as
psal emp.sal%type;--存放工资
pcomm emp.comm%type;--存放奖金
begin
select sal,comm into psal,pcomm from emp where inno = no;--获取薪水和奖金
return psal*12+nvl( pcomm,0); --函数与过程的结构类似,但是必须要有一个return子句,用来返回函数值
end:
/
in和out参数:过程和函数都可以通过out 指定一个或者是多个输出参数,我们可以利用out参数,在过程和函数中直线返回多个值。
--out参数实现查询员工姓名,月薪和职位
CREATE OR REPLACE PROCEDURE CHAXUNDUOGE (INNO IN NUMBER;OUTNAME OUT CHAR(12);OUTSAL OUT CHAR(12);OUTJOB OUT CHAR(20))
AS
begin
select name,sal,job into OUTNAME,OUTSAL,OUTJOB from emp where no = inno;
end;
/