<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
--==============================
--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[orreplace]procedure过程名称
[(参数 [{in|out|inout}] 类型,
·······
(参数 [{in|out|inout}] 类型 )]
[authid{current_user|designer}]
{is|as}
begin
过程体
end
下面是具体参数的解释:
orraplace:如果加上这个关键字,那么新创建的过程将取代旧的过程。具体执行了撤销和重建两个操作。
如果要创建的过程已经存在,而我们没有将其先删除,将会得到“ORA-955 :该名称已被当前对象使用”的错误。
in:表明此参数为传入参数,调用处传实参给过程的形参,并进行相应的操作。
out:表明此参数为传出参数,当调用过程,完成相应操作时,此参数作为返回值,返回到过程调用处。
inout:表明此参数既是传入参数,又是传出参数。过程调用处给过程传参,当过程结束时,此参数作为返回值给调用过程处。
这里创建一个存储过程
SQL>createorreplaceprocedurecurrent_time
2as
3curtimevarchar2;
4begin
5selectto_char(sysdate,'yyyy/mm/ddhh24:mi:ss')
6intocurtime
7fromdual;
8dbms_output.put_line('现在时间是:'||chr(9)||curtime);
9endcurrent_time;
2. 存储过程的调用
·直接执行execute 命令
语法:execute 过程名称 [( 参数 1 ,参数 2 , ......)]
executecurrent_time;
·在PL/SQL 语句块中调用
......
current_time;
......
3. 参数设置和传递
a) 参数模式
有三种模式,上面介绍的三种:in 、 out 、 inout 。
b) 使用authid 选项创建存储过程。
当声明存储过程时,可以使用authidcurren_user 或 authiddesigner 选项来制定 oracle 在执行过程时使用的权限域。
·authidcurren_user :在调用时, oracle 使用调用该过程的用户权限域执行该过程,此时调用者必须有权限访问存储过程中所涉及到的所有数据库对象的权限。
·authiddesigner :为默认选线, oracle 将使用过程所有者的权限来执行
过程。
c) 在形参和实参之间传递值
In模式 : 实参到形参的传递,过程结束时,结尾处的形参被赋值给对应的实参。
Out模式:过程内部的 out 模式参数已经被初始化为 NULL 。
Inout模式:传入传出,过程结束时,结尾处的形参被赋值给对应的实参。
d) 对形参的限制
用户不能强制制定参数char 和 varchar2 的长度,以及制定 number 参数的精 度和小数后位数。
但是可以使用%TYPE 来说明参数。如果以参数用 %TYPE 声明,并且说明 %TYPE 的 变量也是强制类型的话,则该强制说明将作用在形参上而不是实参上。
e) 按引用和按值传递参数
子程序参数可以按两种方式传递:按引用或按值传递。
按引用传递:指针的传递,效率高,适用于处理集合类型参数,如:表、数组
按值传递:实参的值被赋予对应形参。
PL/SQL的默认方式是,对参数 in 执行按引用传递,对参数 out 、 inout 按值 传递。
f) 使用nocopy 参数
如果使用了nocopy 的编译选项,则 PL/SQL 编译器将按引用传递参数。语法:
参数名称[ 模式 ]nocopy 数据类型
❤ :对in 模式参数使用 nocopy 将会产生编译错误,因为 in 模式参数总是按引用传 递, nocopy 不能更改其引用方式。
在下列情况下,编译器将忽略nocopy 项:
·参数为索引表的成员时
·实参被强制制定精度、比例或notnull 时
·实参和形参都是记录类型,二者是一隐式方式或使用了%rowtype 类型声明时, 作用在对应字段的强制说明不一致
·传递实参需要隐式类型转换时
·子程序涉及远程调用时
使用nocopy 的主要优点:提高程序的效率,在传递大型 PL/SQL 表时,其优点更 为显著。
<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->4.过程的删除
语法:dropprocedure 过程名
例如:dropprocedurecurrent_time;