子程序是一個(gè)程序單元/模塊執(zhí)行特定的任務(wù)。這些子程序被組合以形成更大的程序。這基本上是被稱為“模塊化設(shè)計(jì)”。子程序可以調(diào)用由另一個(gè)子程序或程序被稱為調(diào)用程序。
子程序可以創(chuàng)建:
在模式層面
在包里面
在一個(gè)PL/SQL塊內(nèi)
模式級(jí)子程序是一個(gè)獨(dú)立的子程序。它使用CREATE PROCEDURE或CREATE FUNCTION語句創(chuàng)建。它被存儲(chǔ)在數(shù)據(jù)庫中,并且可以使用DROP PROCEDURE或DROP FUNCTION語句被刪除。
一個(gè)包內(nèi)創(chuàng)建的一個(gè)子程序是一個(gè)封裝子程序。它被存儲(chǔ)在數(shù)據(jù)庫中,僅當(dāng)包被刪除使用DROP PACKAGE語句可以被刪除。我們將討論在"PL/SQL - 包“ 章節(jié)中。
PL/SQL子程序被命名,可使用一組參數(shù)來調(diào)用PL/SQL塊。 PL/SQL提供兩種子程序:
函數(shù):這些子程序返回一個(gè)值,主要用于計(jì)算并返回一個(gè)值。
過程:這些子程序沒有直接返回值,主要用于執(zhí)行操作。
本章將重點(diǎn)介紹PL/SQL的過程的重內(nèi)容,我們將在下一章介紹學(xué)習(xí)"PL/SQL函數(shù)“。
每個(gè)PL/SQL子程序有一個(gè)名稱,并且可以具有一個(gè)參數(shù)列表。就像匿名PL/SQL塊,并命名塊子程序也將有以下三個(gè)部分:
| S.N. | 部分 & 描述 |
|---|---|
| 1 |
聲明部分 它是一個(gè)任選的組成部分。然而聲明部分用于子程序并在開始時(shí)使用DECLARE關(guān)鍵字。它包含:類型,光標(biāo),常量,變量,異常和嵌套子程序聲明。這些項(xiàng)局部于子程序和停止時(shí),子程序完成執(zhí)行完成前存在。 |
| 2 |
執(zhí)行部分 這是一個(gè)強(qiáng)制性的一部分,包含執(zhí)行指定操作語句 |
| 3 |
異常處理部分 這也是一個(gè)可選部分,它包含處理運(yùn)行時(shí)錯(cuò)誤的代碼。 |
過程使用CREATE OR REPLACE PROCEDURE語句創(chuàng)建,使用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] 選項(xiàng)允許修改現(xiàn)有的程序
可選的參數(shù)列表中包含的名稱,模式和類型的參數(shù)。IN表示該值將被從外部傳遞,OUT表示該參數(shù)將被用于從過程返回一個(gè)值到外面
procedure-body 包含可執(zhí)行部分
AS關(guān)鍵字來代替了IS關(guān)鍵字用于創(chuàng)建一個(gè)獨(dú)立的程序。
下面的示例創(chuàng)建一個(gè)字符串的簡單過程執(zhí)行時(shí)將'Hello World!“顯示在屏幕上。
CREATE OR REPLACE PROCEDURE greetings AS BEGIN dbms_output.put_line('Hello World!'); END; /
當(dāng)上面的代碼中使用SQL提示執(zhí)行,它會(huì)產(chǎn)生以下結(jié)果:
Procedure created.
一個(gè)獨(dú)立的程序可以有兩種方式調(diào)用:
使用EXECUTE關(guān)鍵字
從PL/SQL塊調(diào)用過程的名稱
名為“greetings”的上述程序可以調(diào)用EXECUTE關(guān)鍵字為:
EXECUTE greetings;
上述調(diào)用會(huì)顯示:
Hello World PL/SQL procedure successfully completed.
程序也可以從另一個(gè)PL/SQL塊調(diào)用:
BEGIN greetings; END; /
上述調(diào)用會(huì)顯示:
Hello World PL/SQL procedure successfully completed.
一個(gè)獨(dú)立的程序使用DROP PROCEDURE語句刪除。刪除一個(gè)程序的語法是:
DROP PROCEDURE procedure-name;
所以,可以使用下面的語句刪除 greetings :
BEGIN DROP PROCEDURE greetings; END; /
| S.N. | 參數(shù)模式 & 描述 |
|---|---|
| 1 |
IN 一個(gè)IN參數(shù)傳遞一個(gè)值到子程序。它是一個(gè)只讀的參數(shù)。內(nèi)部的子程序,一個(gè)IN參數(shù)的作用就像一個(gè)常數(shù)。它不能再被分配值。 可以通過一個(gè)常量,文字,初始化變量或表達(dá)式作為一個(gè)IN參數(shù)。也可以把它初始化為默認(rèn)值;然而,在這種情況下,它從子程序調(diào)用刪去。這就是參數(shù)傳遞的默認(rèn)模式。參數(shù)是通過引用傳遞。 |
| 2 |
OUT OUT參數(shù)返回一個(gè)值到調(diào)用程序。在內(nèi)部的子程序OUT參數(shù)就像一個(gè)變量??梢愿淖兯闹挡⒁梅峙浜蟮闹?。實(shí)際參數(shù)必須是變量,它是按值傳遞。 |
| 2 |
IN OUT 一個(gè)IN OUT參數(shù)傳遞的初始值到一個(gè)子程序,并返回一個(gè)更新值給調(diào)用者。它可以被分配一個(gè)值,其值可被讀取。 對(duì)應(yīng)一個(gè)IN OUT形式參數(shù)的實(shí)際參數(shù)必須是一個(gè)變量,不是常量或表達(dá)式。形參必須分配一個(gè)值。實(shí)際參數(shù)就是按值傳遞。 |
該程序查找兩個(gè)值中的最小值,這里過程使用IN模式接收兩個(gè)數(shù)字,并使用OUT參數(shù)返回它們的最小值。
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; /
當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:
Minimum of (23, 45) : 23 PL/SQL procedure successfully completed.
這個(gè)程序計(jì)算傳遞值的平方值。這個(gè)例子表明我們?nèi)绾文軌蛴孟嗤膮?shù)接受的值,然后返回另一個(gè)結(jié)果。
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; /
當(dāng)上述代碼在SQL提示符執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:
Square of (23): 529 PL/SQL procedure successfully completed.
實(shí)際參數(shù)可以通過以下三種方式:
位置標(biāo)記
命名符號(hào)
混合符號(hào)
在位置符號(hào),可以調(diào)用的程序?yàn)椋?/p>
findMin(a, b, c, d);
在位置表示法中,第一實(shí)際參數(shù)代入所述第一形式參數(shù);第二實(shí)際參數(shù)代入所述第二形式參數(shù),依此類推。那么,a取代x,b是取代為y,c為取代z以及d被代替m。
名為符號(hào),實(shí)際參數(shù)與使用箭頭符號(hào)的形式參數(shù)相關(guān)的(=>)。所以程序調(diào)用將如下所示:
findMin(x=>a, y=>b, z=>c, m=>d);
在混合符號(hào)表示法中,可以混合這兩種寫法過程調(diào)用;但是,位置標(biāo)記應(yīng)先于指定符號(hào)。
下面的調(diào)用是合法的:
findMin(a, b, c, m=>d);
但是,這樣是不合法的:
findMin(x=>a, b, c, d);