pl/sql中proceduce过程与func函数均为一个程序块,是为完成特定功能的pl/sql语句集。并可接受三种类型的参数。
相同点在于:
1.均可使用out类型参数返回值。
2.均由声明、执行和异常处理三部分组成。
3.均可以接受形参默认值。
4.都可以使用位置表示法和名称表示法进行调用。
不同点在于:函数必须要有返回值,即调用函数时要用一个变量来接受函数的返回值。
一般推荐若返回多个值,使用过程。
若返回一个值,使用函数。
它们都接受三种类型的参数: in、out、in out。
in类型参数:将外部的参数值传递进入程序块中,但是无法在程序块中更改该参数的值。即类似于常量。采用引用传递。
out类型参数:将内部的参数值传出程序块中,与in类型相反,可以在程序块中更改该参数的值。但是无论外部赋什么值,传入程序块中均被初始化为null。
并且采用值传递的形式。当程序块正常结束无异常或错误发生,则将该值传递给外部参数,否则不会传递给外部参数。可以加上nocopy关键字来使用引用传递模式。
in out类型参数:该类型参数可以传递外部参数值进入程序块中,也可以传出内部参数值给外部参数。采用变量值传递。
注意要点:
1.形参只能决定参数的类型,无法决定精度。只有实参可以决定精度。
2.out类型变量在程序块中赋值时不能超过实参精度的限制。
3.形参可以使用默认值。
4.可以采用名称赋值法。如 pout => v_pout,pinout => v_pinout
过程基本语法结构:
创建:
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [ IN | OUT | IN OUT ] type [,...])]
{ IS | AS }
[ variable type [,...] ]
BEGIN
procedure_body
END procedure_name; -----procedure_name可以不写
删除:
DROP PROCEDURE procedure_name;
调用过程:
1. excute指令调用。
2. pl/sql代码块中直接调用。
函数基本语法结构:
创建:
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [ IN | OUT | IN OUT ] type [,...])]
RETURE type
{ IS | AS }
[ variable type [,...] ]
BEGIN
function_body
END function_name; -----function_name可以不写
删除:
DROP FUNCTION function_name;
调用函数:
无法直接调用,只能作为表达式的一部分进行调用。必须接受返回值,否则报错。
查看过程、函数和包的有关信息:
select * from user_procedures where object_name='my_proc';
查看过程函数代码:
select text from user_source where name = 'MY_PROC';
查看包代码:
select text from user_source where name = 'MY_PKG' AND type = 'PACKAGE';
查看触发器代码:
select text from user_source where name = 'MY_TRIG';
显示错误:
show errors procedure my_proc/function my_func/package my_pack