Procedure是一個程是單元/模組區塊執行特定的任務。這些Procedure被組合以形成更大的程序。這基本上是被稱為“模組塊化設計”。Procedure可以呼叫另一個Procedure。Procedure可以建置:
- 在模式層面
- 在Package裡面
- 在一個PL/SQL區塊內
模組化的Procedure是一個獨立的Procedure。它使用CREATE PROCEDURE或CREATE FUNCTION語法建置。它被存儲在數據庫中,並且可以使用DROP PROCEDURE或DROP FUNCTION語法被刪除。
一個Package內建置的一個Procedure是一個封裝Procedure。它被存儲在數據庫中,僅當Package被刪除使用DROP PACKAGE語法可以被刪除。
PL/SQLProcedure被命名,可使用一組參數來調用PL/SQL區塊。 PL/SQL提供兩種Procedure:
- Function:這些Procedure回傳一個值,主要用於計算並回傳一個值。
- Procedure:這些Procedure不會直接回傳值,主要用於執行操作。
每個PL/SQLProcedure有一個名稱,並且可以具有一個參數列表。就像匿名PL/SQL塊,並命名塊Procedure也將有以下三個部分:
S.N.
|
部分 & 描述
|
1
|
宣告部分
它是一個任選的組成部分。然而宣告部分用於Procedure並在開始時使用DECLARE關鍵字。它Package含:類型,常數,變數,異常和嵌套Procedure宣告。這些宣告需要在Procedure完成執行完成前存在。
|
2
|
執行部分
這是一個強製性的一部分,Package含執行指定操作語法
|
3
|
異常處理部分
這也是一個可選則的部分,它Package含處理運行時錯誤的代碼。
|
建置過程
過程使用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;
|
- procedure-name 指定的程序的名稱
- [OR REPLACE] 選項允許修改現有的程序
- 可選的參數列表中Package含的名稱,模式和類型的參數。IN表示該值將被從外部傳遞,OUT表示該參數將被用於從過程返回一個值到外面
- procedure-body Package含可執行部分
- AS關鍵字來代替了IS關鍵字用於建置一個獨立的程序。
範例:
下面的範例建置一個字符串的簡單過程執行時將'Hello World!“。
CREATE OR REPLACE PROCEDURE test
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
|
結果:
Procedure created.
|
執行獨立Procedure
一個獨立的程序可以有兩種方式調用:
- 使用EXECUTE關鍵字
- 從PL/SQL塊調用過程的名稱
名為“greetings”的上述程序可以調用EXECUTE關鍵字為:
EXECUTE test;
|
上述會顯示:
Hello World
PL/SQL procedure successfully completed.
|
Procedure也可以從另一個PL/SQL區塊呼叫:
BEGIN
greetings;
END;
/
|
上述會顯示:
Hello World
PL/SQL procedure successfully completed.
|
刪除獨立Procedure
一個獨立的Procedure使用DROP PROCEDURE語法刪除。刪除一個程序的語法是:
DROP PROCEDURE procedure-name;
|
所以,可以使用下面的語法刪除 test :
BEGIN
DROP PROCEDURE test;
END;
/
|
PL/SQL Procedure參數模式
S.N
|
參數模式 & 描述
|
1
|
IN:
一個IN參數傳遞一個值到Procedure。它是一個隻讀的參數。內部的Procedure,一個IN參數的作用就像一個常數。它不能再被分配值。 可以通過一個常量,文字,初始化變量或表達式作為一個IN參數。也可以把它初始化為默認值;然而,在這種情況下,它從Procedure調用刪去。這就是參數傳遞的默認模式。參數是通過引用傳遞。
|
2
|
OUT:
OUT參數返回一個值到調用程序。在內部的Procedure OUT參數就像一個變量。可以改變它的值並引用分配後的值。實際參數必須是變量,它是按值傳遞。
|
3
|
IN OUT:
一個IN OUT參數傳遞的初始值到一個Procedure,並返回一個更新值給調用者。它可以被分配一個值,其值可被讀取。
對應一個IN OUT形式參數的實際參數必須是一個變量,不是常量或表達式。形參必須分配一個值。實際參數就是按值傳遞。
|
IN & OUT 模式範例 1
該Procedure會尋找兩個值中的最小值,這裡過程使用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;
/
|
產生了以下結果:
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
|
IN & OUT 模式範例2
這個Procedure計算傳遞值的平方值。這個例子表明我們如何能夠用相同的參數接受的值,然後回傳另一個結果。
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;
/
|
結果:
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);
|
沒有留言:
張貼留言