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子句指定的数据类型,你打算从函数返回。
    • 函数体包含可执行部分。
    • 使用 AS 关键字代替 IS 关键字来创建独立函数。

    例子

    以下示例说明了如何创建和调用独立函数。此函数返回客户表中的客户总数。
    我们将使用我们在PL/SQL 变量章节中创建的 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.
    
  • 调用函数

    在创建函数时,您需要定义函数必须做什么。要使用函数,您必须调用该函数来执行定义的任务。当程序调用函数时,程序控制权转移到被调用函数。
    被调用的函数执行定义的任务,并在执行其返回语句时或 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. 
    

    例子

    以下示例演示声明、定义和调用计算并返回两个值中最大值的简单 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 递归函数

    我们已经看到一个程序或子程序可以调用另一个子程序。当子程序调用自身时,它被称为递归调用,这个过程被称为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.