PL/SQL Function與Procedure相同,不同之處在於函數有一個回傳值。
建置函數
建置函數
建立一個獨立函數可以使用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.
沒有留言:
張貼留言