在本章中,咱們將討論和學習PL/SQL中的函數。函數與過程(也叫程序)相同,只不過函數有返回一個值,而過程沒有返回值。 所以,上一章中全部有關存儲過程的內容也適用於函數。html
使用CREATE FUNCTION
語句建立獨立函數。CREATE OR REPLACE PROCEDURE
語句的簡化語法以下:sql
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, ...])] RETURN return_datatype {IS | AS} BEGIN < function_body > END [function_name];
其中,shell
IN
表示將從外部傳遞的值,OUT
表示將用於返回過程外的值的參數。RETURN
)語句。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 來計算總客戶數量。參考如下代碼 -code
CREATE OR REPLACE FUNCTION totalCustomers RETURN number IS total number(2) := 0; BEGIN SELECT count(*) into total FROM customers; RETURN total; END; /
當使用SQL提示符執行上述代碼時,它將產生如下結果 -htm
在建立一個函數時,咱們給出一個定義函數的語句以及實現的功能。 要使用一個函數,必須調用該函數來執行定義的任務。當程序調用一個函數時,程序控制被傳遞給被調用的函數。遞歸
被調用的函數執行定義的任務,當執行返回語句或達到最後一個結束語句時,它將程序控制返回到主程序。get
若是調用一個函數,只須要傳遞所需的參數和函數名,若是函數返回一個值,那麼能夠存儲返回的值。 如下程序演示如何從匿名塊調用函數totalCustomers -it
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
咱們在前面已經看到程序或子程序可能會調用另外一個子程序。當子程序調用自身時,它被稱爲遞歸調用,該過程稱爲遞歸。
爲了更好地說明遞歸這個概念,讓咱們來看看計算一個給定數字的階乘示例。 數字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 過程已成功完成。