--==============================
--author:yeeXun
--date:发表于 @2010年12月22日 15:37:00
--address:Jau 17-304
--==============================
PL/SQL语句块有两种:命名块和匿名块。
他们的区别在于:
a.匿名块没有自己的名称,以declare或begin开始,每次使用时都要进行编译;匿名块不在数据库中存储并且不能直接从其他的PL/SQL块中调用。
b.命名块可以存储在数据库中并在适当的时候运行。
过程:是一个PL/SQL语句块,它存储在数据字典中并可被应用程序调用。过程没有返回值。
使用存储过程的好处:能够实施数据的安全性。
1.过程的创建
语法:
create [or replace] procedure 过程名称
[ ( 参数 [ { in | out | in out} ] 类型,
·······
( 参数 [ { in | out | in out} ] 类型)]
[authid { current_user | designer}]
{ is | as}
begin
过程体
end
下面是具体参数的解释:
or raplace :如果加上这个关键字,那么新创建的过程将取代旧的过程。具体执行了撤销和重建两个操作。
如果要创建的过程已经存在,而我们没有将其先删除,将会得到“ORA-955:该名称已被当前对象使用”的错误。
in:表明此参数为传入参数,调用处传实参给过程的形参,并进行相应的操作。
out:表明此参数为传出参数,当调用过程,完成相应操作时,此参数作为返回值,返回到过程调用处。
in out:表明此参数既是传入参数,又是传出参数。过程调用处给过程传参,当过程结束时,此参数作为返回值给调用过程处。
这里创建一个存储过程
SQL> create or replace procedure current_time
2 as
3 curtime varchar2;
4 begin
5 select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss')
6 into curtime
7 from dual;
8 dbms_output.put_line('现在时间是:'||chr(9)||curtime);
9 end current_time;
2.存储过程的调用
·直接执行execute命令
语法:execute 过程名称 [(参数1 ,参数2 ,......)]
execute current_time;
·在PL/SQL语句块中调用
......
current_time;
......
3.参数设置和传递
a) 参数模式
有三种模式,上面介绍的三种:in 、 out 、in out。
b) 使用authid选项创建存储过程。
当声明存储过程时,可以使用authid curren_user或authid designer选项来制定oracle在执行过程时使用的权限域。
·authid curren_user:在调用时,oracle使用调用该过程的用户权限域执行该过程,此时调用者必须有权限访问存储过程中所涉及到的所有数据库对象的权限。
·authid designer:为默认选线,oracle将使用过程所有者的权限来执行
过程。
c) 在形参和实参之间传递值
In模式:实参到形参的传递,过程结束时,结尾处的形参被赋值给对应的实参。
Out模式:过程内部的out模式参数已经被初始化为NULL。
In out模式:传入传出,过程结束时,结尾处的形参被赋值给对应的实参。
d) 对形参的限制
用户不能强制制定参数char和varchar2的长度,以及制定number参数的精 度和小数后位数。
但是可以使用%TYPE来说明参数。如果以参数用%TYPE声明,并且说明%TYPE的 变量也是强制类型的话,则该强制说明将作用在形参上而不是实参上。
e) 按引用和按值传递参数
子程序参数可以按两种方式传递:按引用或按值传递。
按引用传递:指针的传递,效率高,适用于处理集合类型参数,如:表、数组
按值传递:实参的值被赋予对应形参。
PL/SQL的默认方式是,对参数in执行按引用传递,对参数out、in out按值 传递。
f) 使用nocopy参数
如果使用了nocopy的编译选项,则PL/SQL编译器将按引用传递参数。语法:
参数名称 [模式] nocopy 数据类型
❤:对in模式参数使用nocopy将会产生编译错误,因为in模式参数总是按引用传 递,nocopy不能更改其引用方式。
在下列情况下,编译器将忽略nocopy项:
·参数为索引表的成员时
·实参被强制制定精度、比例或not null时
·实参和形参都是记录类型,二者是一隐式方式或使用了%rowtype类型声明时, 作用在对应字段的强制说明不一致
·传递实参需要隐式类型转换时
·子程序涉及远程调用时
使用nocopy的主要优点:提高程序的效率,在传递大型PL/SQL表时,其优点更 为显著。
4.过程的删除
语法:drop procedure 过程名
例如:drop procedure current_time;