PL/SQL的函数和存储过程
PL/SQL的函数(Function)和存储过程(Procedure),可以理解为匿名块(Anonymous Block)的升级版,函数和存储过程就是编译成数据库对象的匿名块。它们相对于匿名块,具有以下优点:
1、编译一次,方便在数据库对象中查找,可以多次重复使用。
2、可以处理输入和输出的参数。
3、可以逐条语句执行进行测试。
一、函数(Function)
函数的编写格式如下:
函数的编写,有几个需要注意的地方:
1、定义函数输入参数时,可以省略“in”关键字,即:fnPlusAB(paramA integer,paramB integer,……)。
2、定义函数输出参数时,必须带有“out”关键字,即:fnPlusAB(……,paramC out varchar2)。
3、函数必须定义返回值类型,并且,在begin和end之间的语句,必须有返回值,即return xxx。
4、如果begin和end之间的语句包含if条件语句或for循环语句等,必须考虑到每一个分支,都有一个返回值,即return xxx。
在调用函数时,需要注意,必须有一个变量或值来接收函数的返回值,如下两种格式:
1、条件判断
if fnPlusAB(1,2,p_Msg)=3 then
......
end if;
在这段语句中,函数返回值是3,因此if条件语句通过判断,且p_Msg输出参数值为'A+B=3'。
2、变量赋值
l_C:=fnPlusAB(1,2,p_Msg);
在这段语句中,函数返回值是3,因此l_C接收返回值,变为3,且p_Msg输出参数值为'A+B=3'。
如果没有一个变量或值来接收函数的返回值,那么是无法调用函数的,例如如下的错误示例:
fnPlusAB(1,2,p_Msg);
二、存储过程(Procedure)
存储过程的编写格式类似于函数,但也有一些不同,示例如下:
存储过程的编写,有几个需要注意的地方:
1、定义存储过程参数时,与函数类似,可以省略“in”关键字,不能省略“out”关键字。
2、存储过程不能定义返回值类型,而且在begin和end之间的语句不能包含return xxx。
在调用存储过程时,由于没有返回值,可以直接传入参数调用即可:
pcPlusAB(1,2,p_Msg);
由于没有返回值,该存储过程执行完成后,只是将p_Msg输出参数值改为'A+B=3'。
经过以上的对比,函数和存储过程唯一的区别就是有没有返回值,因此在选择的时候可以根据实际情况,需要返回值则选择函数,不需要则选择存储过程。
领取专属 10元无门槛券
私享最新 技术干货