1. 程式人生 > >Oracle資料庫開發必備利器之PL/SQL

Oracle資料庫開發必備利器之PL/SQL

第一章 概述

1.PL/SQL簡介

    Oracle PL/SQL語言(Procedural Language/SQL)是結合了結構化查詢與Oracle自身過程控制為一體的強大語言,支援多種資料型別,擁有自身的變數宣告、賦值語句,而且還有條件、迴圈等流程控制語句。過程控制結構與SQL資料處理能力無縫的結合形成了強大的程式語言,可以建立過程和函式以及程式包。

    PL/SQL是一種塊結構的語言,它將一組語句放在一個塊中,一次性發送給伺服器,PL/SQL引擎分析收到PL/SQL語句塊的內容,把其中的過程控制語句由PL/SQL引擎自身去執行,把PL/SQL塊中的SQL語句交給伺服器的sql語句執行器執行。

      

     PL/SQL 塊傳送給伺服器後,先被編譯然後執行,對於有名稱的 PL/SQL 塊(如子程式)

可以單獨編譯,永久的儲存在資料庫中,隨時準備執行。PL/SQL 的優點還有:

     1.支援SQL    PL/SQL支援所有的SQL資料操縱命令、遊標控制命令、事物控制命令、SQL函式、運算子和偽列。支援所有的SQL資料型別和null值。

     2.支援面向物件程式設計    在PL/SQL中可以建立型別,可以對型別進行及成果,可以在子程式中過載方法等。

     3.更好的效能    SQL是非過程語言,只能一條一條的執行,而PL/SQL把一個PL/SQL塊統一進行編譯後執行,同時還可以把編譯好的PL/SQL塊儲存起來,減少了應用程式額伺服器之間的通訊時間,PL/SQL是快速而高效的。

     4.可移植性    使用PL/SQL編寫的應用程式,可以移植到任何的操作平臺上的Oracle伺服器上,同時還可以編寫可移植程式庫,在不同環境中重用。

      5.安全性    可以通過儲存過程對客戶機伺服器之間的應用程式邏輯進行分隔,這樣可以限制對Oracle資料庫的訪問,資料庫還可以授權和撤銷其他使用者的訪問能力。


2.PL/SQL塊

    PL/SQL是一種快結構的語言,一個PL/SQL程式包含了一個或者多個邏輯快,邏輯快中可以宣告變數,變數在使用之前必須先宣告。除了正常的執行程式外,還提供了專門的異常處理部分進行異常處理。每個邏輯塊分為是三個部分。

    語法結構:PL/SQL塊

    [DECLARE

            ---declaration statements]//說明部分,變數和常量的定義,如果不宣告可省略

    [BEGIN

            ---executable  statements]//以END結尾,程式體,END後面也用分號

    [EXCEPTION

            ---exception  statements]//異常處理部分,可選,出現異常時跳轉到異常部分執行

     PL/SQL是一種程式語言,也有自身的語言特點:

        1.對大小寫不敏感,為了良好的程式風格,開發團隊都會選擇一個合適的編碼標準。

        2.PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以是多行的,但分號表示該語句結束。一行中可以有多條sql語句,他們之間以分號分割,但是不推薦一行中寫多條語句。

      PL/SQL中的特殊符號說明:

      

第二章 PL/SQL基礎語法

1.PL/SQL資料型別

      PL/SQL的資料型別包括標量資料型別,引用資料型別和儲存文字、影象、視訊、聲音等非結構化的大資料型別等。

       1.標量資料型別

         標量資料型別的變數只有一個值,且內部沒有分量。標量資料型別包括數字型、字元型、日期型和布林型。

                

                

       2.屬性資料型別

    當一個變數的值是資料庫中的一行或者是資料庫中某列時,可以直接使用屬性型別來宣告。Oracle中存在兩種屬性型別:%TYPE和%ROWTYPE。

    %ROWTYPE:引用資料庫表中的一行作為資料型別,即RECODE型別(記錄型別),是PL/SQL附加的資料型別。表示一條記錄,就相當於C#中的一個物件。可以使用“.”來訪問記錄中的屬性。

     程式碼演示: 

    SQL> DECLARE
            myemp EMP%ROWTYPE; //宣告一個myemp物件,該物件表示EMP表中的一行
         BEGIN
            SELECT * INTO myemp FROM emp WHERE empno=7934; //從EMP表中查詢出一條記錄放入myemp物件中
            dbms_output.put_line(myemp.ename); 訪問該物件的屬性可以使用“.”
         END;
         /
         MILLER

        %TYPE:引用某個變數或者資料庫的列的型別作為某變數的資料型別。

2.PL/SQL條件控制和迴圈控制

    PL/SQL程式可通過條件或迴圈結構來控制命令執行的流程。PL/SQL提供了豐富的流程控制語句。有三種控制結構:順序結構、條件結構、迴圈結構。

    1.條件控制(if語句)  

        1.if-then

           語法結構:if    條件  then

                                  --條件結構體

                             end if;

         2.if-then-else

            語法結構:if    條件    then

                                    --條件成立結構體

                             else

                                    --條件不成立結構體

                             end if;

          3.if-then-elsif

             語法結構:if    條件1    then

                                    --條件1成立結構體

                              elsif   條件2    then

                                     --條件2成立結構體

                              else

                                     --以上條件都不成立結構體

                              end if;

    2.case

     case是一種選擇結構的控制語句,可以根據條件從朵兒執行分支中選擇相應的執行動作。也可以作為表示式使用,返回一個值,類似於switch語句。

     語法結構:

         case[selector]

                when  表示式1  then 語句序列1;

                when  表示式2  then 語句序列2;

                ......

                [else 語句序列 n]

          end case;

    3.迴圈結構

     Oracle提供的迴圈型別有:

         1.無條件迴圈loop-end loop 語句

         2.while迴圈語句

         3.for迴圈語句

      1.loop迴圈(無限迴圈)

            語法格式:loop

                                 -迴圈體

                             end loop;

           2.while迴圈

            語法格式:while  條件  loop

                                   --迴圈體

                              end loop;

           3.for迴圈

           for迴圈需要預先確定迴圈次數,可通過給迴圈變數指定下限和上限來確定迴圈執行的次數,然後迴圈變數在每次迴圈中遞增(或者遞減)。

       語法結構:

             for 迴圈變數 in[reverse] 迴圈下限...迴圈上限 loop loop

                    --迴圈體

             end  loop;

             注:reverse:指明迴圈從上限向下限一次迴圈。

    4.順序結構 

     在程式順序結構中有兩個特殊的語句,goto和null

     1.goto語句

      goto語句將無條件的跳轉到標籤指定的語句中去執行。標籤是用雙尖括號括起來的標示塊,在PL/SQL塊中必須具有唯一的名稱,標籤後必須緊跟可執行語句或者PL/SQL塊。goto不能跳轉到if語句、case語句、loop語句或者字塊中。

     2.null語句

      null語句什麼都不做,只是將控制權轉到下一行語句中。null語句是可執行語句。null語句在if或者其他語句語法要求至少執行一條可執行語句,但又不需要具體操作的地方。

3.游標(cursor,也稱遊標)

       Oracle會建立一個儲存區域,被稱為上下文區域,用於處理SQL語句,其中包含需要處理的語句,例如所有的資訊,行數處理,等等。

    遊標是指向這一上下文的區域。 PL/SQL通過控制游標在上下文區域。遊標持有的行(一個或多個)由SQL語句返回。行集合游標保持的被稱為活動集合。可以命名一個游標,它可以在程式中獲取和處理SQL語句,一次返回的行引用。有兩種型別的遊標:隱式遊標、顯式遊標。

    1.隱式遊標

     Oracle在一個SQL語句的執行,當沒有顯式遊標的語句隱式遊標時自動建立。程式設計師無法控制隱式遊標其中的資訊。
     每當發出一個DML語句(INSERT,UPDATE和DELETE),隱式遊標與此語句關聯。對於INSERT操作時,游標保持一個需要插入的資料。對於UPDATE和DELETE操作,游標標識會受到影響的行。
    在PL/SQL,可以參考最近的隱式遊標的SQL遊標,它有類似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT屬性。在SQL遊標有額外的屬性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,設計用於所有語句中使用。下表提供了最常用的屬性的描述:

    

   2.顯示遊標

    顯式遊標是程式設計師定義遊標獲得更多的控制權的上下文的區域。顯式遊標應在PL/SQL塊的宣告部分中定義。這是建立一個SELECT語句返回多行。

    建立顯式遊標語法是:cursor cursor_name is select_statement;

   3.使用顯示遊標的四個工作步驟:

     1.宣告遊標用於初始化在儲存器

     2.開啟遊標分配記憶體

     3.獲取遊標檢索資料

     4.關閉遊標釋放分配的記憶體

   4.宣告遊標

     宣告遊標定義的名稱和相關的select語句。例如:

     CURSOR c_customers IS

        SELECT id,name,address FROM customers;

   5.開啟遊標

     開啟遊標分配記憶體,使得它準備的SQL語句轉換成它返回的行。例如:

     OPEN c_customers;

   6.獲取遊標

     獲取遊標涉及一次訪問一次。例如:將獲取行從上面開啟的遊標:

     FETCH c_customers INTO c_id,c_name,c_addr;

   7.關閉遊標

     關閉遊標來釋放分配的記憶體。例如:關閉前面開啟的遊標

     CLOSE c_customers;

4.PL/SQL的異常處理

  在程式執行時出現的錯誤稱為異常。發生異常後,語句將停止執行。PL/SQL引擎立即將控制權轉到PL/SQL塊的異常處理部分。異常處理機制簡化了程式碼中的錯誤檢查。PL/SQL中任何異常出現時,每一個異常都對應一個異常碼和異常資訊。

  1.預定義異常

   為了oracle開發和維護的方便,在Oracle異常中,為常見的異常碼定義了對應的異常名稱,稱為預定義異常。常見的預定義異常有:

   

   語法格式:異常處理  

    begin 
      --可執行部分
    exception  --異常處理開始
      when 異常名1 then
          --對應異常處理
      when 異常名2 then
          --對應異常處理
      ......
      when others then
          --其他異常處理
      end;
      2.自定義異常

       除了自定義異常外,使用者還可以在開發中自定義異常,自定義異常尅讓使用者採用與PL/SQL引擎處理錯誤相同的方式進行處理,使用者自定義異常有兩個關鍵點:

     異常定義:採用關鍵字exception宣告異常。例如:myexception exception;

     異常引發:在程式可執行區域,使用raise關鍵字進行引發。例如:raise myexception

     程式碼演示:自定義異常

    DECLARE
    2 sal emp.sal%TYPE;
    3 myexp EXCEPTION; 
    4 BEGIN
    5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
    6 IF sal<5000 THEN
    7 RAISE myexp; 
    8 END IF;
    9 EXCEPTION
    10 WHEN NO_DATA_FOUND THEN
    11 dbms_output.put_line('NO RECORDSET FIND!');
    12 WHEN MYEXP THEN 
    13 dbms_output.put_line('SAL IS TO LESS!');
    14 END;        

5.總結

   1.PL/SQL 是一種塊結構的語言,它將一組語句放在一個塊中,一次性發送給伺服器,PL/SQL 引擎把接收到 PL/SQL 語句塊中的內容進行分析,把其中的過程控制語句由PL/SQL 引擎自身去執行,把 PL/SQL 語句塊中的 SQL 語句交給伺服器的 SQL 語句執行器執行。
    2.PL/SQL 的資料型別包括標量資料型別,引用資料型別和儲存文字、影象、視訊、聲音等非結構化得大資料型別(LOB 資料型別)等。
    3.Oracle 中存在兩種屬性型別:%TYPE 和%ROWTYPE。
    4.PL/SQL 程式可通過控制結構來控制命令執行的流程。PL/SQL 中提供三種程式結構:順序結構、條件結構和迴圈結構。
    5.在 PL/SQL 程式開發中,可以使用 DML 語句和事務控制語句,還可以動態執行 SQL語句,動態執行 SQL 語句的命令是:EXECUTE IMMEDIATE。
    6.在程式執行時出現的錯誤,稱為異常。發生異常後,語句將停止執行,PL/SQL 引擎立即將控制權轉到 PL/SQL 塊的異常處理部分。PL/SQL 中任何異常出現時,每一個異常都對應一個異常碼和異常資訊。