鍍金池/ 教程/ 數(shù)據(jù)庫/ PL/SQL過程
PL/SQL記錄
PL/SQL基本語法
PL/SQL集合
PL/SQL包
PL/SQL關(guān)系運(yùn)算符
PL/SQL比較運(yùn)算符
PL/SQL條件控制
PL/SQL字符串
PL/SQL算術(shù)運(yùn)算符
PL/SQL變量
PL/SQL IF-THEN-ELSIF語句
PL/SQL函數(shù)
PL/SQL異常
PL/SQL FOR循環(huán)語句
PL/SQL日期及時間
PL/SQL EXIT語句
PL/SQL DBMS輸出
PL/SQL過程
PL/SQL CONTINUE語句
PL/SQL數(shù)組
PL/SQL嵌套IF-THEN-ELSE語句
PL/SQL事務(wù)
PL/SQL CASE語句
PL/SQL IF-THEN語句
PL/SQL GOTO語句
PL/SQL運(yùn)算符優(yōu)先級
PL/SQL觸發(fā)器
PL/SQL運(yùn)算符
PL/SQL教程
PL/SQL WHILE循環(huán)語句
PL/SQL面向?qū)ο?/span>
PL/SQL循環(huán)
PL/SQL邏輯運(yùn)算符
PL/SQL IF-THEN-ELSE語句
PL/SQL數(shù)據(jù)類型
PL/SQL環(huán)境安裝設(shè)置
PL/SQL游標(biāo)
PL/SQL基本循環(huán)語句
PL/SQL搜索CASE語句
PL/SQL常量和文字
PL/SQL嵌套循環(huán)

PL/SQL過程

子程序是一個程序單元/模塊執(zhí)行特定的任務(wù)。這些子程序被組合以形成更大的程序。這基本上是被稱為“模塊化設(shè)計”。子程序可以調(diào)用由另一個子程序或程序被稱為調(diào)用程序。

子程序可以創(chuàng)建:

  • 在模式層面

  • 在包里面

  • 在一個PL/SQL塊內(nèi)

模式級子程序是一個獨(dú)立的子程序。它使用CREATE PROCEDURE或CREATE FUNCTION語句創(chuàng)建。它被存儲在數(shù)據(jù)庫中,并且可以使用DROP PROCEDURE或DROP FUNCTION語句被刪除。

一個包內(nèi)創(chuàng)建的一個子程序是一個封裝子程序。它被存儲在數(shù)據(jù)庫中,僅當(dāng)包被刪除使用DROP PACKAGE語句可以被刪除。我們將討論在"PL/SQL - 包“ 章節(jié)中。

PL/SQL子程序被命名,可使用一組參數(shù)來調(diào)用PL/SQL塊。 PL/SQL提供兩種子程序:

  • 函數(shù):這些子程序返回一個值,主要用于計算并返回一個值。

  • 過程:這些子程序沒有直接返回值,主要用于執(zhí)行操作。

本章將重點(diǎn)介紹PL/SQL的過程的重內(nèi)容,我們將在下一章介紹學(xué)習(xí)"PL/SQL函數(shù)“。

PL/SQL子程序部分

每個PL/SQL子程序有一個名稱,并且可以具有一個參數(shù)列表。就像匿名PL/SQL塊,并命名塊子程序也將有以下三個部分:

S.N. 部分 & 描述
1 聲明部分
它是一個任選的組成部分。然而聲明部分用于子程序并在開始時使用DECLARE關(guān)鍵字。它包含:類型,光標(biāo),常量,變量,異常和嵌套子程序聲明。這些項局部于子程序和停止時,子程序完成執(zhí)行完成前存在。
2 執(zhí)行部分
這是一個強(qiáng)制性的一部分,包含執(zhí)行指定操作語句
3 異常處理部分
這也是一個可選部分,它包含處理運(yùn)行時錯誤的代碼。

創(chuàng)建過程

過程使用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àn)有的程序

  • 可選的參數(shù)列表中包含的名稱,模式和類型的參數(shù)。IN表示該值將被從外部傳遞,OUT表示該參數(shù)將被用于從過程返回一個值到外面

  • procedure-body 包含可執(zhí)行部分

  • AS關(guān)鍵字來代替了IS關(guān)鍵字用于創(chuàng)建一個獨(dú)立的程序。

例子:

下面的示例創(chuàng)建一個字符串的簡單過程執(zhí)行時將'Hello World!“顯示在屏幕上。

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

當(dāng)上面的代碼中使用SQL提示執(zhí)行,它會產(chǎn)生以下結(jié)果:

Procedure created.

執(zhí)行獨(dú)立程序

一個獨(dú)立的程序可以有兩種方式調(diào)用:

  • 使用EXECUTE關(guān)鍵字

  • 從PL/SQL塊調(diào)用過程的名稱

名為“greetings”的上述程序可以調(diào)用EXECUTE關(guān)鍵字為:

EXECUTE greetings;

上述調(diào)用會顯示:

Hello World

PL/SQL procedure successfully completed.

程序也可以從另一個PL/SQL塊調(diào)用:

BEGIN
   greetings;
END;
/

上述調(diào)用會顯示:

Hello World

PL/SQL procedure successfully completed.

刪除獨(dú)立程序

一個獨(dú)立的程序使用DROP PROCEDURE語句刪除。刪除一個程序的語法是:

DROP PROCEDURE procedure-name;

所以,可以使用下面的語句刪除 greetings :  

BEGIN
   DROP PROCEDURE greetings;
END;
/

PL/SQL子程序參數(shù)模式

S.N. 參數(shù)模式 & 描述
1 IN
一個IN參數(shù)傳遞一個值到子程序。它是一個只讀的參數(shù)。內(nèi)部的子程序,一個IN參數(shù)的作用就像一個常數(shù)。它不能再被分配值。 可以通過一個常量,文字,初始化變量或表達(dá)式作為一個IN參數(shù)。也可以把它初始化為默認(rèn)值;然而,在這種情況下,它從子程序調(diào)用刪去。這就是參數(shù)傳遞的默認(rèn)模式。參數(shù)是通過引用傳遞。
2 OUT
OUT參數(shù)返回一個值到調(diào)用程序。在內(nèi)部的子程序OUT參數(shù)就像一個變量??梢愿淖兯闹挡⒁梅峙浜蟮闹?。實際參數(shù)必須是變量,它是按值傳遞。
2 IN OUT
一個IN OUT參數(shù)傳遞的初始值到一個子程序,并返回一個更新值給調(diào)用者。它可以被分配一個值,其值可被讀取。
對應(yīng)一個IN OUT形式參數(shù)的實際參數(shù)必須是一個變量,不是常量或表達(dá)式。形參必須分配一個值。實際參數(shù)就是按值傳遞。

IN & OUT 模式示例 1

該程序查找兩個值中的最小值,這里過程使用IN模式接收兩個數(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í)行時,它產(chǎn)生了以下結(jié)果:

 Minimum of (23, 45) : 23

PL/SQL procedure successfully completed.

IN & OUT 模式示例2

這個程序計算傳遞值的平方值。這個例子表明我們?nèi)绾文軌蛴孟嗤膮?shù)接受的值,然后返回另一個結(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í)行時,它產(chǎn)生了以下結(jié)果:

Square of (23): 529

PL/SQL procedure successfully completed.

方法傳遞參數(shù)

實際參數(shù)可以通過以下三種方式:

  • 位置標(biāo)記

  • 命名符號

  • 混合符號

位置表示法

在位置符號,可以調(diào)用的程序為:

findMin(a, b, c, d);

在位置表示法中,第一實際參數(shù)代入所述第一形式參數(shù);第二實際參數(shù)代入所述第二形式參數(shù),依此類推。那么,a取代x,b是取代為y,c為取代z以及d被代替m。

命名表示法

名為符號,實際參數(shù)與使用箭頭符號的形式參數(shù)相關(guān)的(=>)。所以程序調(diào)用將如下所示:

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

混合表示法

在混合符號表示法中,可以混合這兩種寫法過程調(diào)用;但是,位置標(biāo)記應(yīng)先于指定符號。

下面的調(diào)用是合法的:

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

但是,這樣是不合法的:

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

上一篇:PL/SQL日期及時間下一篇:PL/SQL集合