Plsql 简明教程
PL/SQL - Functions
在本章中,我们将讨论 PL/SQL 中的函数。函数与过程相同,只是函数会返回值。因此,前一章的所有讨论也适用于函数。
Creating a Function
使用 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 关键字。
Example
以下示例说明如何创建和调用独立函数。此函数返回 customers 表中 CUSTOMER 的总数。
我们将使用我们创建在 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.
Calling a Function
在创建函数时,你需要提供函数将要完成的功能的定义。要使用函数,你必须调用此函数执行已定义的任务。当程序调用函数时,对此被调用函数实施程序控制。
一个被调用的函数执行定义的任务,当它的返回语句执行或 last end statement 达到时,它将程序控制权返回给主程序。
要调用函数,你只需传回所需参数和函数名字,如果函数返回一个值,那么你便可以储存返回的值。下列程序从匿名代码组调用了函数 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.
Example
以下的例子显示如何用 PL/SQL 函数宣布、定义和启动一个简单的 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 Recursive Functions
我们已经看到,一个程序或子程序可能会调用另一个子程序。当一个子程序调用它自己,它称之为递归调用并且此过程称为 recursion 。
为了说明这个概念,让我们计算一个数字的阶乘。一个数字 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.