1. 程式人生 > >(七)PL/SQLPL/SQL過程

(七)PL/SQLPL/SQL過程

但是 src ont 封裝 開始 默認 nbsp 以及 計算

一、子程序是一個程序單元/模塊執行特定的任務。這些子程序被組合以形成更大的程序。這基本上是被稱為“模塊化設計”。子程序可以調用由另一個子程序或程序被稱為調用程序。

子程序可以創建:
   1.在模式層面
  2.在包裏面
  3.在一個PL/SQL塊內

  1.模式級子程序是一個獨立的子程序。它使用CREATE PROCEDURE或CREATE FUNCTION語句創建。它被存儲在數據庫中,並且可以使用DROP PROCEDURE或DROP FUNCTION語句被刪除。
  2.一個包內創建的一個子程序是一個封裝子程序。它被存儲在數據庫中,僅當包被刪除使用DROP PACKAGE語句可以被刪除。


  3.PL/SQL子程序被命名,可使用一組參數來調用PL/SQL塊。 PL/SQL提供兩種子程序:
    函數:這些子程序返回一個值,主要用於計算並返回一個值。
    過程:這些子程序沒有直接返回值,主要用於執行操作。

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

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


三、一創建過程
過程語句創建,語法如下:
  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.


三、二執行獨立程序
一個獨立的程序可以有兩種方式調用:
  1.使用EXECUTE關鍵字
  2.從PL/SQL塊調用過程的名稱

名為“greetings”的上述程序
1.程序可以調用EXECUTE關鍵字為:
  EXECUTE greetings;
上述調用會顯示:
  Hello World
  PL/SQL procedure successfully completed.


2.程序也可以從另一個PL/SQL塊調用:
  BEGIN
   greetings;
  END;
  /
上述調用會顯示:
  Hello World
  PL/SQL procedure successfully completed.


三、三刪除獨立程序
刪除一個程序的語法是:
  DROP PROCEDURE procedure-name;

下面的語句刪除 greetings :
  BEGIN
   DROP PROCEDURE greetings;
  END;
  /

四、PL/SQL子程序參數模式

S.N.參數模式 & 描述
1 IN
一個IN參數傳遞一個值到子程序。它是一個只讀的參數。內部的子程序,一個IN參數的作用就像一個常數。它不能再被分配值。 可以通過一個常量,文字,初始化變量或表達式作為一個IN參數。也可以把它初始化為默認值;然而,在這種情況下,它從子程序調用刪去。這就是參數傳遞的默認模式。參數是通過引用傳遞。
2 OUT
OUT參數返回一個值到調用程序。在內部的子程序OUT參數就像一個變量。可以改變它的值並引用分配後的值。實際參數必須是變量,它是按值傳遞。
2 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.

五、方法傳遞參數
實際參數可以通過以下三種方式:
  位置標記
  命名符號
  混合符號

1.位置表示法
在位置符號,可以調用的程序為:
  findMin(a, b, c, d);
在位置表示法中,第一實際參數代入所述第一形式參數;第二實際參數代入所述第二形式參數,依此類推。那麽,a取代x,b是取代為y,c為取代z以及d被代替m。

2.命名表示法
名為符號,實際參數與使用箭頭符號的形式參數相關的(=>)。所以程序調用將如下所示:
  findMin(x=>a, y=>b, z=>c, m=>d);

3.混合表示法
在混合符號表示法中,可以混合這兩種寫法過程調用;【但是,位置標記應先於指定符號】。
  是合法的:findMin(a, b, c, m=>d);
  但是,這樣是不合法的:findMin(x=>a, b, c, d);

(七)PL/SQLPL/SQL過程