PL/SQL - 函数
在本章中,我们将讨论 PL/SQL 中的函数。函数与过程类似,不同之处在于它会返回一个值。因此,前一章中关于过程的所有讨论也适用于函数。
创建函数
独立函数使用 CREATE FUNCTION 语句创建。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];
其中,
function-name 指定函数的名称。
[OR REPLACE] 选项允许修改现有函数。
可选的参数列表包含参数的名称、模式和类型。IN 表示从外部传入的值,OUT 表示用于向过程外部返回值的参数。
函数必须包含 return 语句。
RETURN 子句指定从函数返回的数据类型。
function-body 包含可执行部分。
创建独立函数时,使用 AS 关键字代替 IS 关键字。
示例
以下示例说明如何创建和调用独立函数。此函数返回 customers 表中 CUSTOMERS 的总数。
我们将使用在 PL/SQL Variables 章节中创建的 CUSTOMERS 表 −
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 语句 执行或到达 最后一个 END 语句 时,将程序控制权返回给主程序。
要调用函数,只需将所需的参数与函数名一起传递,如果函数返回一个值,则可以存储返回的值。以下程序从匿名块中调用函数 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.
PL/SQL 递归函数
我们已经看到,程序或子程序可以调用另一个子程序。当一个子程序调用自身时,称为递归调用,该过程称为 递归。
为了说明这个概念,让我们计算一个数的阶乘。一个数 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.