PL/SQL函數(shù)與過程相同,不同之處在于函數(shù)有一個返回值。因此,前面的章節(jié)中的所有討論都適用于函數(shù)。
建立一個獨立函數(shù)可以使用CREATE FUNCTION語句創(chuàng)建。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 指定函數(shù)的名稱
[OR REPLACE] 選項允許修改現(xiàn)有的函數(shù)
可選的參數(shù)列表中包含的名稱,模式和類型的參數(shù)。IN表示該值將被從外部傳遞和OUT表示該參數(shù)將被用于過程外面返回一個值
函數(shù)必須包含一個return語句
RETURN 子句指定要在函數(shù)返回的數(shù)據(jù)類型
function-body 包含可執(zhí)行部分
AS關鍵字來代替了IS關鍵字用于創(chuàng)建一個獨立的函數(shù)
下面的示例說明創(chuàng)建和調(diào)用一個獨立的函數(shù)。函數(shù)返回在CUSTOMERS表中的客戶總數(shù)。我們將使用CUSTOMERS表,已在前面PL/SQL變量的章節(jié)中創(chuàng)建:
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提示執(zhí)行,它會產(chǎn)生以下結果:
Function created.
當創(chuàng)建一個函數(shù),給定什么樣的函數(shù)之前必須做一個定義。要使用函數(shù)必須調(diào)用該函數(shù)來執(zhí)行規(guī)定的任務。當程序調(diào)用的函數(shù),程序控制被轉移到所調(diào)用的函數(shù)。
調(diào)用函數(shù)定義執(zhí)行任務時,被執(zhí)行的return語句或達到其最后一個語句,程序控制返回到主程序。
調(diào)用函數(shù)只需要通過必要的參數(shù)以及函數(shù)名稱,如果函數(shù)返回一個值,那么可以存儲返回值。下面的程序是調(diào)用一個匿名塊函數(shù) totalCustomers:
DECLARE c number(2); BEGIN c := totalCustomers(); dbms_output.put_line('Total no. of Customers: ' || c); END; /
當上述代碼在SQL提示符執(zhí)行時,它產(chǎn)生了以下結果:
Total no. of Customers: 6 PL/SQL procedure successfully completed.
下面就是一個例子這表明聲明,定義和調(diào)用一簡單的PL/SQL函數(shù),計算并返回兩個值中的最大值。
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提示符執(zhí)行時,它產(chǎn)生了以下結果:
Maximum of (23,45): 45 PL/SQL procedure successfully completed.
我們已經(jīng)看到,程序或子程序可以調(diào)用另一個子程序。當子程序調(diào)用自身,它被稱為遞歸調(diào)用。
為了說明這個概念,讓我們計算一個數(shù)的階乘。一個數(shù)n的階乘定義為:
n! = n*(n-1)! = n*(n-1)*(n-2)! ... = n*(n-1)*(n-2)*(n-3)... 1
下面的程序計算給定數(shù)的階乘通過調(diào)用自身遞歸:
上一篇:PL/SQL數(shù)據(jù)類型下一篇:PL/SQL嵌套循環(huán)