PL/SQL函數

在本章中,我們將討論和學習PL/SQL中的函數。函數與過程(也叫程式)相同,只不過函數有返回一個值,而過程沒有返回值。 因此,上一章中所有有關存儲過程的內容也適用於函數。

1. 創建函數

使用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)中的總數。

我們將使用在PL/SQL變數章節中創建的CUSTOMERS表 -

CREATE TABLE CUSTOMERS(
   ID   INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY   DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

-- 數據
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );

基於上面表和數據記錄,創建一個函數:totalCustomers 來計算總客戶數量。參考以下代碼 -

CREATE OR REPLACE FUNCTION totalCustomers
RETURN number IS
   total number(2) := 0;
BEGIN
   SELECT count(*) into total
   FROM customers;

   RETURN total;
END;
/

當使用SQL提示符執行上述代碼時,它將產生以下結果 -

2. 調用函數

在創建一個函數時,我們給出一個定義函數的語句以及實現的功能。 要使用一個函數,必須調用該函數來執行定義的任務。當程式調用一個函數時,程式控制被傳遞給被調用的函數。

被調用的函數執行定義的任務,當執行返回語句或達到最後一個結束語句時,它將程式控制返回到主程序。

如果調用一個函數,只需要傳遞所需的參數和函數名,如果函數返回一個值,那麼可以存儲返回的值。 以下程式演示如何從匿名塊調用函數totalCustomers -

SET SERVEROUTPUT ON SIZE 99999;
DECLARE
   c number(2);
BEGIN
   c := totalCustomers();
   dbms_output.put_line('當前客戶的總數為: ' || c);
END;
/

執行上面示例代碼,得到以下結果 -

示例

以下示例演示聲明,定義和調用一個簡單的PL/SQL函數,該函數計算並返回兩個值中的最大值。

SET SERVEROUTPUT ON SIZE 99999;
CREATE OR REPLACE 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;
/
DECLARE
   a number;
   b number;
   c number;
BEGIN
   a:= 23;
   b:= 45;
   c := findMax(a, b);
   dbms_output.put_line('兩個數:23,45 之中的最大值是: ' || c);
END;
/

執行上面示例代碼,得到以下結果 -

兩個數:23,45 之中的最大值是: 45

3. PL/SQL遞歸函數

我們在前面已經看到程式或副程式可能會調用另一個副程式。當副程式調用自身時,它被稱為遞歸調用,該過程稱為遞歸。

為了更好地說明遞歸這個概念,讓我們來看看計算一個給定數字的階乘示例。 數字n的因數被定義為 -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

以下過程是通過遞歸調用本身來計算給定數字的階乘 -

SET SERVEROUTPUT ON SIZE 99999;
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:= 10;
   factorial := fact(num);
   dbms_output.put_line(' 數字 '|| num || ' 的階乘積是: ' || factorial);
END;
/

當上述代碼在SQL提示符下執行時,它會產生以下結果 -

數字 10 的階乘積是: 3628800

PL/SQL 過程已成功完成。


上一篇: PL/SQL存儲過程 下一篇: PL/SQL游標