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表,已在前面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語句或達到其最後一個語句,程序控制返回到主程序。
調用函數只需要通過必要的參數以及函數名稱,如果函數返回一個值,那麼可以存儲返回值。下面的程序是調用一個匿名塊函數 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.
我們已經看到,程序或子程序可以調用另一個子程序。當子程序調用自身,它被稱為遞歸調用。
為了說明這個概念,讓我們計算一個數的階乘。一個數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.