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 的总数。

我们将使用 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 语句或到达 **最后一个 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.
广告