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];
哪里,
函数名指定函数的名称。
[OR REPLACE]选项允许修改现有的功能。
可选的参数列表包含名称,模式和类型的参数。在表示该值将来自外部的传递和OUT表示该参数将被用于该过程的外面返回一个值。
该函数必须包含一个return语句。
RETURN子句指定数据类型你会从函数返回。
函数体包含了可执行的部分。
AS关键字被用来代替IS关键字来创建一个独立的函数。
例:
下面的例子说明创建和调用一个独立的功能。该函数返回客户的客户表中的总数。我们将使用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.
调用一个函数
在创建一个函数,你给什么样的功能,必须做一个定义。要使用的功能,你将不得不调用该函数来执行定义的任务。当程序调用的函数,程序控制被转移到所调用的函数。
被调用函数执行确定的任务,并执行其返回语句时或到达上次结束发言时,返回程序控制返回到主程序。
给你打电话只需用传递函数名以及所需参数的函数,如果函数返回一个值,那么你可以存储返回值。下面的程序调用从一个匿名块功能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.