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变量的章节中创建:
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.
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.