在本章中,我们将讨论PL/SQL中的函数.函数与过程相同,只是它返回一个值.因此,前一章的所有讨论也适用于函数.
使用创建独立函数创建功能语句. CREATE OR REPLACE PROCEDURE 语句的简化语法如下 :
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, ...])] RETURN return_datatype {IS | AS} BEGIN < function_body > END [function_name];
其中,
功能-name 指定函数的名称.
[OR REPLACE]选项允许修改现有函数.
可选参数列表包含参数的名称,模式和类型. IN表示将从外部传递的值,OUT表示将用于在过程外返回值的参数.
该函数必须包含a return 语句.
RETURN 子句指定您要从中返回的数据类型函数.
function-body 包含可执行部分.
使用AS关键字代替IS关键字来创建独立函数.
以下示例说明如何创建和调用独立函数.此函数返回customers表中的CUSTOMERS总数.
我们将使用CUSTOMERS表,我们在 PL/SQL变量章节 : 号;
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers RETURN number IS total number(2) := 0; BEGIN SELECT count(*) into total FROM customers; RETURN total; END; /
当使用SQL提示符执行上述代码时,它将产生以下结果 :
Function created.
在创建函数时,您可以定义函数必须执行的操作.要使用函数,您必须调用该函数来执行定义的任务.当一个程序调用一个函数时,程序控制被转移到被调用的函数.
一个被调用的函数执行定义的任务,当它的return语句被执行或的最后一个结束时到达语句,它将程序控制返回给主程序.
要调用函数,您只需要传递所需的参数以及函数名称,如果该函数返回一个值,然后您可以存储返回的值.以下程序从匿名块调用函数 totalCustomers :
DECLARE c number(2); BEGIN c := totalCustomers(); dbms_output.put_line('Total no. of Customers: ' || c); END; /
当在SQL提示符下执行上述代码时,它会产生以下结果 :
Total no. of Customers: 6 PL/SQL procedure successfully completed.
以下示例演示声明,定义和调用计算和返回的简单PL/SQL函数最多两个值.
DECLARE a number; b number; c number; FUNCTION findMax(x IN number, y IN number) RETURN number IS z number; BEGIN IF x > y THEN z:= x; ELSE Z:= y; END IF; RETURN z; END; BEGIN a:= 23; b:= 45; c := findMax(a, b); dbms_output.put_line(' Maximum of (23,45): ' || c); END; /
当在SQL提示符下执行上述代码时,它会产生以下结果 :
Maximum of (23,45): 45 PL/SQL procedure successfully completed.
我们已经看到程序或子程序可能会调用另一个子程序.当一个子程序调用自身时,它被称为递归调用,该过程称为递归.
为了说明这个概念,让我们计算一个阶乘一个数字.数字n的阶乘定义为 :
n! = n*(n-1)! = n*(n-1)*(n-2)! ... = n*(n-1)*(n-2)*(n-3)... 1
以下程序通过递归调用自身来计算给定数字的阶乘;
DECLARE num number; factorial number; FUNCTION fact(x number) RETURN number IS f number; BEGIN IF x=0 THEN f := 1; ELSE f := x * fact(x-1); END IF; RETURN f; END; BEGIN num:= 6; factorial := fact(num); dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); END; /
当在SQL提示符下执行上述代码时,它会产生以下结果 :
Factorial 6 is 720 PL/SQL procedure successfully completed.