PL/SQL 函數(shù)

2021-08-30 16:01 更新

在本章中,我們將討論和學(xué)習(xí)PL/SQL中的函數(shù)。函數(shù)與過程(也叫程序)相同,只不過函數(shù)有返回一個值,而過程沒有返回值。 因此,上一章中所有有關(guān)存儲過程的內(nèi)容也適用于函數(shù)。

1. 創(chuàng)建函數(shù)

使用CREATE FUNCTION語句創(chuàng)建獨立函數(shù)。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];
SQL

其中,

  • function-name是指定要創(chuàng)建的函數(shù)的名稱。
  • [OR REPLACE]選項指示是否允許修改現(xiàn)有的函數(shù)。
  • 可選參數(shù)列表包含參數(shù)的名稱,模式和類型。 IN表示將從外部傳遞的值,OUT表示將用于返回過程外的值的參數(shù)。
  • 函數(shù)必須包含一個返回(RETURN)語句。
  • RETURN子句指定要從函數(shù)返回的數(shù)據(jù)類型。
  • function-body包含可執(zhí)行部分。
  • 使用AS關(guān)鍵字代替IS關(guān)鍵字,用來創(chuàng)建獨立的函數(shù)。

示例

以下示例說明如何創(chuàng)建和調(diào)用獨立函數(shù)。此函數(shù)返回客戶表(CUSTOMERS)中的總數(shù)。

我們將使用在PL/SQL變量章節(jié)中創(chuàng)建的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) 
);  

-- 數(shù)據(jù)
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 );
SQL

基于上面表和數(shù)據(jù)記錄,創(chuàng)建一個函數(shù):totalCustomers 來計算總客戶數(shù)量。參考以下代碼 -

CREATE OR REPLACE FUNCTION totalCustomers 
RETURN number IS 
   total number(2) := 0; 
BEGIN 
   SELECT count(*) into total 
   FROM customers; 

   RETURN total; 
END; 
/
SQL

當(dāng)使用SQL提示符執(zhí)行上述代碼時,它將產(chǎn)生以下結(jié)果 -


2. 調(diào)用函數(shù)

在創(chuàng)建一個函數(shù)時,我們給出一個定義函數(shù)的語句以及實現(xiàn)的功能。 要使用一個函數(shù),必須調(diào)用該函數(shù)來執(zhí)行定義的任務(wù)。當(dāng)程序調(diào)用一個函數(shù)時,程序控制被傳遞給被調(diào)用的函數(shù)。

被調(diào)用的函數(shù)執(zhí)行定義的任務(wù),當(dāng)執(zhí)行返回語句或達到最后一個結(jié)束語句時,它將程序控制返回到主程序。

如果調(diào)用一個函數(shù),只需要傳遞所需的參數(shù)和函數(shù)名,如果函數(shù)返回一個值,那么可以存儲返回的值。 以下程序演示如何從匿名塊調(diào)用函數(shù)totalCustomers -

SET SERVEROUTPUT ON SIZE 99999;
DECLARE 
   c number(2); 
BEGIN 
   c := totalCustomers(); 
   dbms_output.put_line('當(dāng)前客戶的總數(shù)為: ' || c); 
END; 
/
SQL

執(zhí)行上面示例代碼,得到以下結(jié)果 -


示例

以下示例演示聲明,定義和調(diào)用一個簡單的PL/SQL函數(shù),該函數(shù)計算并返回兩個值中的最大值。

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('兩個數(shù):23,45 之中的最大值是: ' || c); 
END; 
/
SQL

執(zhí)行上面示例代碼,得到以下結(jié)果 -

兩個數(shù):23,45 之中的最大值是: 45
Shell

3. PL/SQL遞歸函數(shù)

我們在前面已經(jīng)看到程序或子程序可能會調(diào)用另一個子程序。當(dāng)子程序調(diào)用自身時,它被稱為遞歸調(diào)用,該過程稱為遞歸。

為了更好地說明遞歸這個概念,讓我們來看看計算一個給定數(shù)字的階乘示例。 數(shù)字n的因子被定義為 -

n! = n*(n-1)! 
   = n*(n-1)*(n-2)! 
      ... 
   = n*(n-1)*(n-2)*(n-3)... 1

以下過程是通過遞歸調(diào)用本身來計算給定數(shù)字的階乘 -

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(' 數(shù)字 '|| num || ' 的階乘積是: ' || factorial); 
END; 
/
SQL

當(dāng)上述代碼在SQL提示符下執(zhí)行時,它會產(chǎn)生以下結(jié)果 -

數(shù)字 10 的階乘積是: 3628800

PL/SQL 過程已成功完成。

 



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號