11. PL/SQL Function

PL/SQL FunctionProcedure相同,不同之處在於函數有一個回傳值。
建置函數
建立一個獨立函數可以使用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] 選項允許修改現有的函數
  •        可選的參數列表中Package含的名稱,模式和類型的參數。IN表示該值將被從外部傳遞和OUT表示該參數將被用於過程外面回傳一個值
  •        函數必須Package含一個return語法
  •        RETURN 子句指定要在函數回傳的數據類型
  •        function-body Package含可執行部分
  •        AS關鍵字來代替了IS關鍵字用於建置一個獨立的函數

範例:
下面的範例說明建置和呼叫一個獨立的函數。函數回傳在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;
/
結果如下:
Function created.
呼叫一個函數
當建置一個函數,給定什麼樣的函數之前必須做一個定義。要使用函數必須呼叫該函數來執行規定的任務。當程序呼叫的函數,程序控製被轉移到所呼叫的函數。
呼叫函數定義執行任務時,被執行的return語法或達到其最後一個語法,程序控製回傳到主程序。
呼叫函數隻需要通過必要的參數以及函數名稱,如果函數回傳一個值,那麼可以存儲回傳值。下面的程序是呼叫一個匿名區塊函數 totalCustomers
DECLARE
   c number(2);
BEGIN
   c := totalCustomers();
   dbms_output.put_line('Total no. of Customers: ' || c);
END;
/
結果如下:
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;
/
結果如下:
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;
/
結果如下:
Factorial 6 is 720 
 
PL/SQL procedure successfully completed.


沒有留言:

張貼留言