文章思维导图
一. 存储过程和存储函数的定义
定义:存储在数据库中,供所有用户程序调用的子程序叫做存储过程/存储函数。复杂点的解释:存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
区别:是否可以通过return返回函数值。
存储函数可以通过return返回函数值;而存储过程不可以。
注意:由于通过out参数,存储过程也可以返回函数值,所以存储过程和存储函数已经没有太大的区别了。而存储函数仍然存在,是由于oracle不断升级,需要实现向下兼容,所以存储函数就一直存留着。
二. 存储过程
1. 创建和使用存储过程
用create procedure命令建立存储过程,语法如下:
create [or replace] procedure 过程名(参数列表)
as -- as不可以省略
PLSQL子程序体;
注意事项:
1> 存储过程或者存储函数,只能创建或者替换。
2> 参数可以带也可以不带。
3> as相当于PLSQL语句中的declare,用来声明变量、游标等,但是不可以省略。
2. 入门案例:
(1)不带参数的存储过程:不用带括号
create or replace procedure sayHello
as
begin
dbms_output.put_line('HelloWorld');
end;
/
调用方式:
<1> 使用execute:
exec是sqlplus命令,只能在sqlplus中使用,使用时,exec可以直接跟过程名(可以省略括号);
控制台执行示例:
SQL> set serveroutput on;
SQL> exec sayHello;
<2> 使用call:
使用call时,要带上括号;call为SQL命令使用时,对场景没有限制。
控制台执行示例:
SQL> set serveroutput on;
SQL> call sayHello();
<3> 使用PLSQL语句调用:
控制台执行示例:
SQL> set serveroutput on;
SQL> begin
sayHello;
end;
/
(2)带参数的存储过程:
给指定的员工涨100元工资,并且打印涨前和涨后的薪水:
create or replace procedure addSal(pempno in emp.empno%type)
as
pename emp.ename%type;
beforesal emp.sal%type;
aftersal emp.sal%type;
begin
select ename,sal into pename,beforesal from emp where empno=pempno;
aftersal:=beforesal+100;
update emp set sal=aftersal where empno=pempno;
dbms_output.put_line('姓名: '||pename||' 涨前工资:'||beforesal||'涨后工资:'||aftersal);
end;
/
执行代码截图
** 注意事项:**
<1> 要说明,参数是输入参数(in)还是输出参数(out);
<2> 为保证调用多个存储过程中处在同一个事务中,所以一般不在存储过程或者存储函数中,commit或rollback;
3. 调试存储过程:
SQL Developer 调试存储过程
** 注意事项:**
(1) oracle数据库和PLSQL工具都是放在同一个机器上;
(2) 在开启调试时,可能会报出权限不够的错误信息,通过下面方式进行授权:
授权
三. 存储函数
1. 存储函数:
函数(Function)为一命名的存储程序,可带参数,并返回一计算值.
函数和过程的结构类似,但必须有一个return子句,用于返回函数值.
2. 创建存储函数的语法:
create [or replace] function 函数名(参数列表)
return 函数值类型
as
PLSQL子程序体;
注意事项:
(1) 与存储过程注意事项类似,不同的是,必须有个返回值;
(2) 参数列表可以有,也可以没有.当没有时,函数名后面不要带括号.
create or replace function queryempannal(pempno in number)
return number
as
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=pempno;
return psal*12+nvl(pcomm,0);
end;
四. in和out参数
1.概述
(1) 一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值.
(2) 过程和函数都可以通过out指定一个或多个输出参数.我们可以利用out参数,在过程和函数中实现返回多个值.
a. 存储过程和存储函数都可以有out参数;
b. 存储过程和存储函数都可以有多个out参数;
c. 存储过程可以通过out参数来实现返回值;
(3) 什么时候用存储过程/存储函数?
原则:如果只有一个返回值,用存储函数;否则,就用存储过程.
create or replace procedure queryempinform(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2 )
as
begin
select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/