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.
廣告
© . All rights reserved.