PL/SQL - 過程



在本章中,我們將討論 PL/SQL 中的過程。一個子程式是一個執行特定任務的程式單元/模組。這些子程式組合在一起形成更大的程式。這基本上稱為“模組化設計”。子程式可以由另一個子程式或程式呼叫,該程式稱為呼叫程式

可以建立子程式 -

  • 在模式級別
  • 在包內
  • 在 PL/SQL 塊內

在模式級別,子程式是一個獨立的子程式。它使用 CREATE PROCEDURE 或 CREATE FUNCTION 語句建立。它儲存在資料庫中,可以使用 DROP PROCEDURE 或 DROP FUNCTION 語句刪除。

在包內建立的子程式是打包的子程式。它儲存在資料庫中,只有在使用 DROP PACKAGE 語句刪除包時才能刪除。我們將在“PL/SQL - 包”一章中討論包。

PL/SQL 子程式是命名的 PL/SQL 塊,可以使用一組引數呼叫。PL/SQL 提供兩種子程式 -

  • 函式 - 這些子程式返回單個值;主要用於計算和返回值。

  • 過程 - 這些子程式不會直接返回值;主要用於執行操作。

本章將涵蓋PL/SQL 過程的重要方面。我們將在下一章討論PL/SQL 函式

PL/SQL 子程式的組成部分

每個 PL/SQL 子程式都有一個名稱,並且可能還有一個引數列表。與匿名 PL/SQL 塊一樣,命名塊也將具有以下三個部分 -

序號 部分和說明
1

宣告部分

這是一個可選部分。但是,子程式的宣告部分不會以 DECLARE 關鍵字開頭。它包含型別、遊標、常量、變數、異常和巢狀子程式的宣告。這些專案是子程式的區域性變數,並在子程式完成執行時停止存在。

2

可執行部分

這是必需部分,包含執行指定操作的語句。

3

異常處理

這又是一個可選部分。它包含處理執行時錯誤的程式碼。

建立過程

過程使用CREATE OR REPLACE PROCEDURE語句建立。CREATE OR REPLACE PROCEDURE 語句的簡化語法如下 -

CREATE [OR REPLACE] PROCEDURE procedure_name 
[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
{IS | AS} 
BEGIN 
  < procedure_body > 
END procedure_name; 

其中,

  • 過程名稱指定過程的名稱。

  • [OR REPLACE] 選項允許修改現有過程。

  • 可選的引數列表包含引數的名稱、模式和型別。IN表示將從外部傳遞的值,OUT表示用於將值返回到過程外部的引數。

  • 過程體包含可執行部分。

  • AS 關鍵字用於建立獨立過程,而不是 IS 關鍵字。

示例

以下示例建立了一個簡單的過程,當執行時在螢幕上顯示字串“Hello World!”。

CREATE OR REPLACE PROCEDURE greetings 
AS 
BEGIN 
   dbms_output.put_line('Hello World!'); 
END; 
/

當使用 SQL 提示符執行上述程式碼時,它將產生以下結果 -

Procedure created.

執行獨立過程

可以以兩種方式呼叫獨立過程 -

  • 使用EXECUTE關鍵字

  • 從 PL/SQL 塊呼叫過程的名稱

上面名為“greetings”的過程可以用 EXECUTE 關鍵字呼叫,如下所示 -

EXECUTE greetings;

上述呼叫將顯示 -

Hello World

PL/SQL procedure successfully completed.

也可以從另一個 PL/SQL 塊呼叫該過程 -

BEGIN 
   greetings; 
END; 
/

上述呼叫將顯示 -

Hello World  

PL/SQL procedure successfully completed. 

刪除獨立過程

獨立過程使用DROP PROCEDURE語句刪除。刪除過程的語法為 -

DROP PROCEDURE procedure-name; 

您可以使用以下語句刪除 greetings 過程 -

DROP PROCEDURE greetings; 

PL/SQL 子程式中的引數模式

下表列出了 PL/SQL 子程式中的引數模式 -

序號 引數模式和說明
1

IN

IN 引數允許您將值傳遞給子程式。它是一個只讀引數。在子程式內部,IN 引數充當常量。它不能被賦值。您可以將常量、字面量、已初始化的變數或表示式作為 IN 引數傳遞。您還可以將其初始化為預設值;但是,在這種情況下,它將從子程式呼叫中省略。它是引數傳遞的預設模式。引數透過引用傳遞

2

OUT

OUT 引數將值返回給呼叫程式。在子程式內部,OUT 引數充當變數。您可以更改其值並在賦值後引用該值。實際引數必須是變數,並且透過值傳遞

3

IN OUT

IN OUT引數將初始值傳遞給子程式並將更新後的值返回給呼叫者。它可以被賦值,並且可以讀取該值。

對應於 IN OUT 形式引數的實際引數必須是變數,而不是常量或表示式。形式引數必須被賦值。實際引數透過值傳遞。

IN 和 OUT 模式示例 1

此程式查詢兩個值的最小值。在這裡,過程使用 IN 模式獲取兩個數字,並使用 OUT 引數返回它們的最小值。

DECLARE 
   a number; 
   b number; 
   c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS 
BEGIN 
   IF x < y THEN 
      z:= x; 
   ELSE 
      z:= y; 
   END IF; 
END;   
BEGIN 
   a:= 23; 
   b:= 45; 
   findMin(a, b, c); 
   dbms_output.put_line(' Minimum of (23, 45) : ' || c); 
END; 
/

當在 SQL 提示符下執行上述程式碼時,它將產生以下結果 -

Minimum of (23, 45) : 23  

PL/SQL procedure successfully completed. 

IN 和 OUT 模式示例 2

此過程計算傳遞值的平方。此示例顯示瞭如何使用相同的引數來接受值,然後返回另一個結果。

DECLARE 
   a number; 
PROCEDURE squareNum(x IN OUT number) IS 
BEGIN 
  x := x * x; 
END;  
BEGIN 
   a:= 23; 
   squareNum(a); 
   dbms_output.put_line(' Square of (23): ' || a); 
END; 
/

當在 SQL 提示符下執行上述程式碼時,它將產生以下結果 -

Square of (23): 529 

PL/SQL procedure successfully completed.

傳遞引數的方法

實際引數可以透過三種方式傳遞 -

  • 位置表示法
  • 命名錶示法
  • 混合表示法

位置表示法

在位置表示法中,您可以如下呼叫過程 -

findMin(a, b, c, d);

在位置表示法中,第一個實際引數替換第一個形式引數;第二個實際引數替換第二個形式引數,依此類推。因此,a 替換 xb 替換 yc 替換 zd 替換 m

命名錶示法

在命名錶示法中,使用箭頭符號(=>)將實際引數與形式引數關聯。過程呼叫將類似於以下內容 -

findMin(x => a, y => b, z => c, m => d);

混合表示法

在混合表示法中,您可以在過程呼叫中混合這兩種表示法;但是,位置表示法應位於命名錶示法之前。

以下呼叫是合法的 -

findMin(a, b, c, m => d);

但是,這不是合法的

findMin(x => a, b, c, d); 
廣告