子程序是一個程序單元/模塊執行特定的任務。這些子程序被組合以形成更大的程序。這基本上是被稱為“模塊化設計”。子程序可以調用由另一個子程序或程序被稱為調用程序。
子程序可以創建:
在模式層面
在包裡面
在一個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塊,並命名塊子程序也將有以下三個部分:
過程使用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] 選項允許修改現有的程序
可選的參數列表中包含的名稱,模式和類型的參數。IN表示該值將被從外部傳遞,OUT表示該參數將被用於從過程返回一個值到外面
procedure-body 包含可執行部分
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 :
BEGIN DROP PROCEDURE greetings; END; /
該程序查找兩個值中的最小值,這裡過程使用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.
這個程序計算傳遞值的平方值。這個例子表明我們如何能夠用相同的參數接受的值,然後返回另一個結果。
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);