函数
2012/3/22
函数与存储过程非常相似,它也是一种存储在数据库中的命名程序块,也可以接受输入值,进行逻辑处理后将结果返回调用者。函数与存储过程之间的主要区别在于,函数必须有返回值,并且可以作为一个表达式的一部分,但不能作为一个完整的语句使用。
创建函数
创建函数的语法与创建存储过程的语法非常相似,它们遵循相同的规则,参数传递也相同。只是在创建函数事可以为其指定大量的属性。创建函数的基本语法如下:
create [or replace] function function_name
[(parameter [{ in | out | in out}] date_type,
parameter [{ in | out | in out}] date_type,……)]
return return_type;
{is|as}
Declaration section
Begin
Executable statements
Exception
Exception handlers;
End [function_name]
从这个语法结构可以看出,定义存储过程和函数之间的主要区别之一是,函数必须包含RETURN数据类型子句,用于指定函数返回的数据类型。在函数体内,用户可以再任何地方使用RETURN<expression>语句返回值,其返回值的数据类型必须是函数头中声明的。
例如,下面创建的函数用于求某个数的阶乘:
createorreplacefunction TestFunction (n innumber)
returnnumber
as
Resultnumber:=1;
begin
for i in1..n
loop
Result:=Result*i;
endloop;
return(Result);
end TestFunction;
创建的函数TestFunction可以求出任意正整数n!。需要注意,该函数的头部声明看了return值的类型,然后在函数体中使用return语句来返回一个该类型的值。
调用函数
调用函数与调用过程不同,调用函数时,需要一个变量来保存返回值的结果值,这样函数就组成了表达式的一部分。因此,不能像调用过程那样调用过程那样独立的调用函数。
例如调用上面创建好的TestFunction函数:
declare
var_num number:=5;
var_function number:=0;
begin
var_function:=TestFunction(var_num);
dbms_output.put_line(var_function);
end;
输出结果为;
试图通过EXEC语句来调用函数TestFunction,正如下面错误提示信息所显示
TestFunction不是过程
提示:
在函数中也可以使用OUT参数,但是在函数中同时使用RETURN和OUT参数很容易产生混淆,所以在创建函数时,应该使用RETURN语句返回一个单独的值,而将OUT参数用于过程中。