官术网_书友最值得收藏!

5.1 PL/SQL簡介

視頻講解:光盤\TM\lx\5\PL/SQL簡介.mp4

PL/SQL(Procedural Language/SQL)是一種過程化語言,在PL/SQL中可以通過IF語句或LOOP語句實現控制程序的執行流程,甚至可以定義變量,以便在語句之間傳遞數據信息,這樣PL/SQL語言就能夠實現操控程序處理的細節過程,不像普通的SQL語句(如DML語句、DQL語句)那樣沒有流程控制,也不存在變量,因此使用PL/SQL語言可以實現比較復雜的業務邏輯。PL/SQL是Oracle的專用語言,它是對標準SQL語言的擴展,它允許在其內部嵌套普通的SQL語句,這樣就將SQL語句的數據操縱能力、數據查詢能力和PL/SQL的過程處理能力結合在一起,達到取長補短的目的。

5.1.1 PL/SQL塊結構

PL/SQL程序都是以塊(BLOCK)為基本單位,整個PL/SQL塊分三部分:聲明部分(用DECLARE開頭)、執行部分(以BEGIN開頭)和異常處理部分(以EXCEPTION開頭)。其中執行部分是必須的,其他兩個部分可選。無論PL/SQL程序段的代碼量有多大,其基本結構都是由這三部分組成。標準PL/SQL塊的語法格式如下:

        [DECLARE]
          --聲明部分,可選
        BEGIN
          --執行部分,必須
        [EXCEPTION]
          --異常處理部分,可選
        END

接下來對PL/SQL塊的三個組成部分進行詳細說明。

(1)聲明部分由關鍵字DECLARE開始,到BEGIN關鍵字結束。在這部分可以聲明PL/SQL程序塊中所用到的變量、常量和游標等。需要注意的是:在某個PL/SQL塊中聲明的內容只能在當前塊中使用,而在其他PL/SQL塊中是無法引用的。

(2)執行部分以關鍵字BEGIN開始,它的結束方式通常有兩種。如果PL/SQL塊中的代碼在運行時出現異常,則執行完異常處理部分的代碼就結束;如果沒有使用異常處理或PL/SQL塊未出現異常,則以關鍵字END結束。執行部分是整個PL/SQL程序塊的主體,主要的邏輯控制和運算都在這部分完成,所以在執行部分可以包含多個PL/SQL語句和SQL語句。

(3)異常處理部分以關鍵字EXCEPTION開始,在該關鍵字所包含的代碼執行完畢后,整個PL/SQL塊也就結束了。在執行PL/SQL代碼(主要是執行部分)的過程中,可能會產生一些意想不到的錯誤,比如除數為零,空值參與運算等,這些錯誤都會導致程序中斷運行。這樣程序設計人員就可以在異常處理部分通過編寫一定量的代碼來糾正錯誤或者給用戶提供一些錯誤信息提示,甚至是將各種數據操作回退到異常產生之前的狀態,以備重新運行代碼塊。另外,對于可能出現的多種異常情況,用戶可以使用WHEN THEN語句來實現多分支判斷,然后在每個分支下通過編寫代碼來處理相應的異常。

對于PL/SQL塊中的語句,需要指出的是:每一條語句都必須以分號結束,每條SQL語句可以寫成多行的形式,同樣必須使用分號來結束。另外,一行中也可以有多條SQL語句,但是它們之間必須以分號分隔。接下來通過一個簡單的示例來看一下PL/SQL塊的完整應用。

【例5.1】 定義一個PL/SQL代碼塊,計算兩個整數的和與這兩個整數的差的商,代碼如下(實例位置:光盤\TM\sl\5\1)

本例運行結果如圖5.1所示。

圖5.1 求兩個整數的和與差的商

        SQL> set serveroutput on
        SQL> declare
          2   a int:=100;
          3   b int:=200;
          4   c number;
          5  begin
          6   c:=(a+b)/(a-b);
          7   dbms_output.put_line(c);
          8  exception
          9   when zero_divide then
         10   dbms_output.put_line(’除數不許為零!');
         11  end;
         12  /

在上面的代碼中,首先使用“set serveroutput on”命令來實現在服務端顯示執行結果;然后使用declare關鍵字聲明3個變量,其中,前兩個整型(int)變量a和b的初始值分別為100和200;最后在PL/SQL塊的執行部分計算出這兩個整數的和與它們之間差的商,并調用“dbms_output.put_line(c); ”語句輸出計算結果。另外,為了防止除數為零的情況發生,代碼中還設置了異常處理部分。若發生除數為零的情況,則代碼塊通過調用“dbms_output.put_line(’除數不許為零!'); ”語句向用戶輸出提示信息。

5.1.2 代碼注釋和標示符

注釋用于對程序代碼進行解釋說明,它能夠增強程序的可讀性,使程序更易于理解。注釋編譯時會被PL/SQL編譯器忽略掉,注釋有單行注釋和多行注釋兩種情況。另外,在PL/SQL塊中聲明的變量、常量、游標和存儲過程等標識符的名稱都是由一系列字符集所組成的,Oracle對這些組成標識符的字符集有一定的規范和要求。本小節將對這兩項內容進行講解。

1.單行注釋

單行注釋由兩個連接字符“--”開始,后面緊跟著注釋內容。

【例5.2】 編寫一段PL/SQL代碼塊,并為主要代碼添加單行注釋,代碼如下。

        SQL>set serveroutpu on                                     --在服務器端輸出結果
        SQL> declare
          2   Num_sal number;                                      --聲明一個數值變量
        3   Var_ename varchar2(20);                                --聲明一個字符串變量
        4  begin
        5   select ename, sal into Var_ename, Num_sal from emp     --檢索指定的值并存儲到變量中
        6   where empno=7369;
        7   dbms_output.put_line(Var_ename||’的工資是’||Num_sal); --輸出變量中值
        8  end;

注意

如果注釋超過一行,就必須在每一行的開頭使用連接字符(--)。

2.多行注釋

多行注釋由/*開頭,以*/結尾,這種多行注釋的方法在大多數的編程語言中是相同的。

【例5.3】 編寫一段PL/SQL代碼塊,并為主要代碼添加多行注釋,代碼如下。

        SQL>set serveroutpu on                           /*在服務器端輸出結果*/
        SQL> declare
          2   Num_sal number;                             /*聲明一個數值變量*/
          3   Var_ename varchar2(20);                     /*聲明一個字符串變量*/
          4  begin
          5   /*檢索指定的值并存儲到變量中*/
          6   select ename, sal into Var_ename, Num_sal from emp
          7   where empno=7369; .
          8   /*輸出變量中值*/
          9   dbms_output.put_line(Var_ename||’的工資是’||Num_sal);
          10  end;

3.標識符

標識符(identifier)用于定義PL/SQL塊單元和程序項的名稱。通過使用標識符,可以定義常量、變量、異常、顯式游標、游標變量、參數、子程序及包的名稱。當使用標識符定義PL/SQL塊或程序單元時,需要滿足以下規則:

當定義變量、常量時,每行只能定義一個變量或者常量(行終止符:;)。

當定義變量、常量時,名稱必須以英文字符(A~Z、a~z)開始,并且最大長度為30個字符。如果以其他字符開始,那么必須使用雙引號引住。

當定義變量、常量時,名稱只能使用符號A~Z、a~z、0~9、_、$和#。如果使用其他字符,那么必須用雙引號引住。

當定義變量、常量時,名稱不能使用Oracle關鍵字。例如不能使用SELECT、UPDATE等作為變量名。如果要使用Oracle關鍵字定義變量、常量,那么必須使用雙引號引住。

(1)合法的標識符

所有的PL/SQL程序元素(比如關鍵字、變量名、常量名等)都是由一些字符序列組合而成的,而這些字符序列中的字符都必須取自PL/SQL語言所允許使用的字符集,那么這些合法的字符集主要包括以下內容:

大寫和小寫字母:A~Z或a~z。

數字:0~9。

非顯示的字符:制表符、空格和回車。

數學符號:+, -, *, /, >, <, =等。

間隔符:包括(), {}, [], ? , ! , ; , :, @, #, %, $, &等。

只有上面列出的這些符合要求的字符才可以在PL/SQL程序標識符中使用,其他的字符都是非法的,不可以使用。類似于SQL,除了由引號引起來的字符串以外,PL/SQL不區分字母的大小寫。標準PL/SQL字符集是ASCII字符集的一部分。ASCII是一個單字節字符集,這就是說每個字符可以表示為一個字節的數據,該性質將字符總數限制在最多為256個。

例如:

        v_ename     VARCHAR2(10);
        v$sal        NUMBER(6,2);      v#sal   NUMBER(6,2);
        v#error       EXCEPTION;
        “1234”       VARCHAR2(20);    --以數字開始,帶有雙引號
        “變量A”      NUMBER(10,2);    --包含數字,帶有雙引號

(2)非法的標識符

例如:

        v%ename    VARCHAR2(10);           --非法符號(%)
        2sal         NUMBER(6,2);          --以數字開始非法
        #vl          EXCEPTION;            --以#開始非法
        v1, v2        VARCHAR2(20);        --每行只能定義一個變量
        變量A       NUMBER(10,2);          --不能以漢字開始
        select            NUMBER(10,2)     --不能使用關鍵字作為變量名

注意

Oracle不支持其他的多字節字符集,這些多字節字符集的字符數目會超過256個。對于不使用英語字母表的語言,多字節字符集是必需的。讀者可以參考Oracle文檔以得到更為詳細的相關信息。

4.分界符

分界符(delimiter)是對PL/SQL有特殊意義的符號(單字符或者字符序列)。它們用來將標識符相互分割開。表5.1列出了在PL/SQL中可以使用的分界符。

表5.1 PL/SQL分界符

5.1.3 文本

文本是指實際的數值的文字,包括數字文本、字符文本、字符串文本、布爾文本、日期時間文本等。

數字文本:數字文本是指整數或者浮點數。當編寫PL/SQL代碼時,可以使用科學計數法和冪操作符(**)。

注意

科學計數法和冪操作符只適用于PL/SQL語句,而不適用于SQL語句。

數字文本如下所示:

100

2.45

3e3

5E6 6*10**3

字符文本:字符文本是指用單引號引住的單個字符,這些字符可以是PL/SQL支持的所有可打印字符,包括英文字符(A~Z、a~z)、數字字符(0~9)及其他字符(<、>等)。字符文本如下所示:

'A'

'9'

'<'

''

'%'

布爾文本:布爾文本是指BOLLEAN值(TRUE、FALSE和NULL),并且布爾文本主要用在條件表達式中。

日期時間文本:日期時間文本是指日期時間值,日期文本必須用單引號引住,并且日期值必須與日期格式和日期語言匹配。日期文本如下所示:

'10-NOV-91'

'1997-10-22 13:01:01'

'09-10-月-03'

字符串文本:字符串文本是指由兩個或兩個以上字符組成的多個字符值,字符串文本必須用單引號引住。字符串文本如下所示:

'Hello World'

'$9600'

'10-NOV-91'

在Oracle Database 10g之前,如果字符串文本包含單引號,那么必須使用兩個單引號表示。例如,如果要為某個變量賦值I'm a string, you're a string.,那么字符串文本必須要采用以下格式:

        string_var:= 'I''m a string, you''re a string.';

在Oracle Database 10g之后,如果字符串文本包含單引號,那么既可以使用原有格式進行賦值,也可以使用其他分隔符([]、{}、<>等)進行賦值。

注意

如果要使用分隔符[]、{}、<>為字符串賦值,那么不僅需要在分隔符前后加單引號,而且需要帶有前綴q。示例如下:

        string_var:= q'[I'm a string, you're a string.]';
主站蜘蛛池模板: 历史| 沙田区| 阿城市| 江永县| 裕民县| 青神县| 靖西县| 龙泉市| 晋江市| 盘锦市| 酒泉市| 大冶市| 通化县| 镇坪县| 洪江市| 神池县| 遂宁市| 曲沃县| 渝北区| 泊头市| 尼木县| 什邡市| 黎城县| 聊城市| 芮城县| 广元市| 山东省| 二手房| 曲阳县| 穆棱市| 五常市| 龙井市| 浦城县| 永州市| 河源市| 宁德市| 磴口县| 承德县| 墨玉县| 莎车县| 酒泉市|