
- PL/SQL 教程
- PL/SQL - 首頁
- PL/SQL - 概述
- PL/SQL - 環境
- PL/SQL - 基本語法
- PL/SQL - 資料型別
- PL/SQL - 變數
- PL/SQL - 常量和字面量
- PL/SQL - 運算子
- PL/SQL - 條件
- PL/SQL - 迴圈
- PL/SQL - 字串
- PL/SQL - 陣列
- PL/SQL - 過程
- PL/SQL - 函式
- PL/SQL - 遊標
- PL/SQL - 記錄
- PL/SQL - 異常
- PL/SQL - 觸發器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事務
- PL/SQL - 日期和時間
- PL/SQL - DBMS 輸出
- PL/SQL - 面向物件
- PL/SQL 有用資源
- PL/SQL - 問題和解答
- PL/SQL - 快速指南
- PL/SQL - 有用資源
- PL/SQL - 討論
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 替換 x,b 替換 y,c 替換 z,d 替換 m。
命名錶示法
在命名錶示法中,使用箭頭符號(=>)將實際引數與形式引數關聯。過程呼叫將類似於以下內容 -
findMin(x => a, y => b, z => c, m => d);
混合表示法
在混合表示法中,您可以在過程呼叫中混合這兩種表示法;但是,位置表示法應位於命名錶示法之前。
以下呼叫是合法的 -
findMin(a, b, c, m => d);
但是,這不是合法的
findMin(x => a, b, c, d);