PLsql基礎文法

來源:互聯網
上載者:User
PL/SQL有自己的字元集、保留字、標點、資料類型、文法等,
  它的注釋採用
   /**/ 來注釋掉一段語句;
   -- 來注釋掉一行語句. 一、文法 1)、變數和常量在PL/SQL程式中可將值儲存在變數和常量中,當程式執行時,變數的值可以改變,而常量的值不能改變。
   聲明方法:
   DECLARE
   變數名 變數類型;
   常量名 constant 常量類型:=常量值;
   表型別宣告:
   將表欄位的類型映射為變數的類型。
   變數名 表名.欄位名%TYPE
   變數名1 表名%ROWTYPE
   一般在聲明變數後應立刻初始化賦值.也可以在聲明時直接賦值:
   變數名 變數類型 :=初始值;
   其中”變數名1”的使用為: 變數名1. 欄位名
  表型別宣告的好處是資料庫結構(主要是指欄位尺寸)發生變化時,不用修改相應程式.因為表型別宣告的變數會在執行時重新編譯,以取得真正的資料類型. 2)指派陳述式
  
變數名:=變數值;
  
   SELECT COL1
   INTO變數名
   FROM TABLE1;
   注:這種賦值方法要求TABLE1表中有且僅有一條記錄。否則將報錯。 3)程式塊式結構:DECLARE
   變數說明部分;
  BEGIN
   執行語句部分;
  [EXCEPTION
   例外處理部分;]
  END; 4)控制語句:分支語句:
  IF condition THEN
   Sequence_of_statements;
  END IF;
  
  IF condition THEN
   Sequence_of_statement1;
  ELSE
   Sequence_of_statement2;
  END IF;
  
  IF condition1 THEN
   Sequence_of_statement1;
  ELSIF condition2 THEN
   Sequence_of_statement2;
  ELSIF condition3 THEN
   Sequence_of_statement3;
  END IF; 5) 控制語句:迴圈語句:
  LOOP
   Sequence_of_statements;
   IF condition THEN
   EXIT;
   END IF;
  END LOOP;
  
   WHILE condition LOOP
   Sequence_of_statements;
  END LOOP;
  
  FOR counter IN lower_bound..higher_bound LOOP
   Sequence_of_statements;
  END LOOP; 6)數組的聲明PL/SQL表與其他過程化語言(如C語言)的一維數組類似。實現PL/SQL表需要建立一個資料類型並另外進行變數說明,不需要事先定義數組大小。
   Type <類型名> Is
   Table Of <資料類型>
   Index by Binary_Integer;
  以下為一個例子:
  Declare
   Type Array_type is
   Table Of Number
   Index by Binary_Integer; --數群組類型的聲明
   My_Array Array_type; --陣列變數的定義
  Begin
   For I In 1..10 Loop
   My_Array(I) := I*2; --數組的初始化
   End Loop;
   For I In 1..10 Loop
   DBMS_OUTPUT.Put_line(To_char(My_Array(I)));
   End Loop;
   End; 7)EXCEPTION處理文法:
   WHEN 異常類型1 THEN
   STATEMENTS;
   WHEN異常類型2 THEN
   STATEMENTS;
   .....
   WHEN OTHERS THEN
   STATEMENTS;
  每個WHEN 語句指一個異常處理。OTHER語句允許定義其他WHEN語句沒有定義的異常處理。在一個塊語句中只允許有一個WHEN OTHERS語句。.
  可以使用SQLCODE函數查看異常值。
   使用SQLERRM函數查看異常資訊。
  使用RAISE_APPLICATION_ERR(錯誤號碼,錯誤訊息);函數可以在EXCEPTION中使用自訂的異常來替換系統異常。 8)自訂ORACLE錯誤碼名稱:oracle錯誤碼有幾百個,但只有最常用的幾十個有名稱.可以給oracle錯誤碼起名
  例:
  DECLARE
   BAD_ROWID EXCEPTION;
   X ROWID;
  PRAGMA EXCEPTION_INIT(BAD_ROWID,-01445);
  --錯誤號碼” -01445”被命名為(BAD_ROWID
  BEGIN
   SELECT ROWID INTO X FROM TAB
   WHERE ROWNUM=1;
  EXCEPTION
  WHEN BAD_ROWID THEN
  DBMS_OUTPUT.PUT_LINE('CANNOT QUERY ROWID FROM THIS VIEW');
   END;
  注意:-01445 因為PRAGMA EXCEPTION_INIT命令把這個變數(-01455)串連到這個ORACLE錯誤,該語句的文法如下:
   PRAGMA EXCEPTION_INIT(exception_name, error_number);
  其中error_number是負數,因為錯誤號碼被認為負數,當定義錯誤時記住使用負號 9) 自訂異常異常不一定必須是oracle返回的系統錯誤,使用者可以在自己的應用程式中建立可觸發及可處理的自訂異常.
  DECLARE
   SALARY_CODE VARCHAR2(1);
   INVALID_SALARY_CODE EXCEPTION;--自訂異常
  BEGIN
   SALARY_CODE:='X';
   IF SALARY_CODE NOT IN('A', 'B', 'C') THEN
   RAISE INVALID_SALARY_CODE;--啟用異常
   END IF;
  EXCEPTION
  WHEN INVALID_SALARY_CODE THEN
   DBMS_OUTPUT.PUT_LINE('INVALID SALARY CODE');
  END;
   二、遊標(CURSOR)屬性 含量
  %FOUND 布爾型屬性,當最近一次該記錄時成功返回,則值為TRUE
  %NOTFOUND 布爾型屬性,它的值總與%FOUND屬性的值相反
  %ISOPEN 布爾型屬性,當游標是開啟時返回TRUE
  %ROWCOUNT 數字型屬性,返回已從游標中讀取的記錄數
  遊標(CURSOR)是指向一個稱為上下文相關區的地區的指標,這個地區在伺服器的處理過程全域區(PGA)內,當伺服器上執行了一個查詢後,查詢返回的記錄集存放在上下文相關區,通過遊標上的操作可以把這些記錄檢索到用戶端的應用程式。 1) 使用游標的基本方法DECLARE
   CURSOR A83D861_cur IS
   SELECT ankKaisha ,ankManno ,
   FROM A83D861;-- 游標定義
  A83D861_rectype A83D861_cur%ROWTYPE ;--定義游標類型的變數
  BEGIN
   OPEN A83D861_cur ;--開啟游標
   LOOP
   FETCH A83D861_cur INTO A83D861_rectype ;--取記錄
  或者 FETCH A83D861_cur INTO lv_ankKaisha ,lv_ankManno;
   EXIT WHEN A83D861_cur%NOTFOUND ;
  --記錄取完退出loop迴圈
   …………處理語句
   END LOOP ;
   CLOSE A83D861_cur ;--關閉游標
  或者
   FOR C_ A83D861_cur IN A83D861_cur LOOP
   C_ A83D861_cur.COL1….
   END LOOP;
  END;
  C_ A83D861_cur不用聲明,它被隱式聲明.三、預存程序,函數,包,子程式:
  預存程序,函數,包在ORACLE中被視為子程式.編譯後被放入ORACLE資料字典中,使用者可直接調用. 1)預存程序:建立文法
   CREATE [OR REPLACE]PROCEDURE 過程名 (in|out參數說明1,in|out參數說明2,。。。) IS
   [局部說明]
   BEGIN
   執行語句;
   [EXCEPTION
   例外處理; ]
   END 過程名; 2)函數:建立文法
   CREATE [OR REPLACE]FUNCTION 函數名 (參數說明1,參數說明2,。。。)
  RETURN 類型 IS
   [局部說明]
   BEGIN
   執行語句;
   RETURN(傳回值);
   [EXCEPTION
   例外處理; ]
   END 函數名;
  
   在例外處理中也要有RETURN語句存在,否則主調語句會報”沒有傳回值”的錯誤.
   如果是要求返回一個CURSOR,需要先定義
   TYPE g_grp_cur is REF CURSOR;
   FUNCTION SP_SEARCH()
   RETURN g_grp_cur
   AS
   o_grp_cur g_grp_cur;
   BEGIN
   OPEN o_grp_cur FOR
   (SQL語句);
   RETURN o_grp_cur;
   END SP_SEARCH;
  不論在過程還是函數中均可再套用SQL語句塊.
  例:
   FUNCTION SP_ADD()
   RETURN VARCHAR2
   AS
   BEGIN
   …………….
   DECLARE
   A INTEGER := 0;
   BEGIN
   NULL;
   EXCEPTION
   WHEN OTHERS THEN
   ROLLBACK;
   END;
  ……………
   RETURN ‘AAA’;
   END SP_ADD; 3)包是被封裝到單獨一個單元的一組過程,函數,變數,SQL語句。包定義中聲明的變數屬於全域變數.只在包體中聲明的過程,函數為該包的私人函數.如果包中函數A調用包中函數B,則B必須先於A聲明,否則報錯.包內過程,函數支援重載, 重載同JAVA.
  在包定義中聲明的函數必須在包體中實現.
  包類似與C的INCLUDE檔案。使用包可以使程式變得模組化且易於管理.
  建立文法,分為兩個部分
  包定義部分
   CREATE [OR REPLACE]PACKAGE 包名
   {IS|AS}
   SQL語句;
   E

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.