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];

其中,

  1. function-name 指定函数的名称。

  2. [OR REPLACE] 选项允许修改现有函数。

  3. 可选参数列表包含参数的名称、模式和类型。IN 表示将从外部传递的值,而 OUT 表示将用于在过程外部返回值的参数。

  4. 该函数必须包含 return 语句。

  5. RETURN 子句指定要从函数返回的数据类型。

  6. function-body 包含可执行部分。

  7. 创建独立函数时,使用 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.