PL/SQL程式設計(1)

edwardking888發表於2010-04-18
今天也開始學習PL/SQL
 
PL/SQL塊結構:
PL/SQL支援兩者型別的程式:一種是匿名塊程式,另一種是命名塊程式。
這兩種程式都有宣告,執行和異常處理部分或塊。匿名塊支援批指令碼,而命名塊能提供儲存程式設計單元。
OL/SQL匿名塊程式的基本原理如下:
[DECLARE]
        declaration_statements
BEGIN
         execution_statements
[EXCEPTION]
          exception_handing_statements
END;
/
PL/SQL對於匿名塊只要求必須有執行部分。
 
必須啟用SQL*PLUS  SERVEROUTPUT變數將內容顯示到控制檯。
 
 
set serveroutput on size 10000;
begin
dbms_output.putline('hello word!');
end;
/
 
注意:
每個PL/SQL塊必須包含一些內容,至少要有一個NULL;語句,否則會使執行時編譯(也稱為分析)失敗。
 
SQL*PLUS支援在互動式控制檯中使用替換變數(以&符號開頭)。替換變數是變長字串或數字。永遠不要在宣告塊中賦動態值,如使用替換變數。
 
PL/SQL中的賦值運算子是冒號後緊跟等號。PL/SQL字串字面值用單引號分割。
ORACLE SQL*PLUS中的@符號載入和執行一個指令碼檔案。
也可以
a)在一個匿名塊的執行部分有巢狀的匿名塊程式;
b)在宣告部分包含命名塊程式,然後依次又包含同型別的巢狀程式;
c)呼叫儲存命名塊程式;
 
 
變數,賦值和運算子
變數名以字母開頭,可以包含字母,數字,$及#符號。變數只有區域性作用域。
這意味這他們只在給定PL/SQL塊的作用域中可用。列外的是巢狀的匿名塊。巢狀的匿名塊在定義塊中起作用。因此,他們可從包含快訪問變數,除非在巢狀的匿名塊中宣告瞭相同的變數。
沒有現實賦值的數字變數的宣告使得其初值為null。
 
可使用賦值運算子或DEFAULT保留字交替地賦初值。下面顯示了一個原型:
DECLARE
      variable_name  NUMBER  [:=  |  DEFAULT]  1;
BEGIN
      variable_name  := 1;
END;
/
 
注意:
只有返回SQL資料型別的函式可在SQL語句中呼叫。返回PL/SQL資料型別的函式只能用於PL/SQL塊中。
 
控制結構
條件結構:PL/SQL中有兩種型別的條件結構。一種是IF語句,另一種是CASE語句。
IF語句有兩種子型別,即if-then-else和if-then-elseif-then-else.
 
IF語句:
下列所示為if-then-else PL/SQL塊的基本原理:
IF  [NOT]  lift_operand1  =  right_operanf1   [[AND|OR]
     [NOT]  lift_operand2  =  right_operanf12  [[AND|OR]
      [NOT]  boolean_operand ]] THEN
     NULL;
ELSE
      NULL;
END IF;
 
提示:
可以使用比較運算子和常量(如 some_boolean = TRUE)檢查BOOLRAN值是否為true,但通常不這樣用。
 
NVL()函式有兩個引數:第一個是變數,第二個是字面值,這個字面值可以是數值型,字串或常量值。這兩個引數必需共享相同的資料型別
 
下列所示就是if-then-elseif-then-else PL/SQL塊的基本原理:
IF  [NOT]  lift_operand1  =  right_operanf1   [[AND|OR]  
              NULL;
 
ELSEIF      NOT]  lift_operand1  =  right_operanf1      [[AND|OR]
                    [NOT]  lift_operand2  =  right_operanf12  [[AND|OR]
                    [NOT]  boolean_operand ]]  THEN
                     NULL;
ELSE
      NULL;
END IF;
 
2.。CASE語句
有兩種CASE語句:一種是簡單CASE語句,另一種是CASE搜尋語句。
下列所示為CASE語句的通用原型:
CASE [TRUE | [selector_variable]]
      WHEN [criterion1  |  expression1]  THEN
                 criterion1_statements;
      WHEN [criterion2  |  expression2]  THEN
                 criterion2_statements;
      WHEN [criterion(n+1)  |  expression(n+1)]  THEN
                 criterion(n+1)_statements;
      ELSE
                 block_statments;
  ENS CASE;
 
下列程式演示了CASE搜尋語句:

BEGIN
 
 CASE  TRUE
   WHEN (1>3) THEN
    dbms_output.put_line('one is greater than three');
   WHEN (3<5) THEN
    dbms_output.put_line('three is less than five');
   WHEN (1=2) THEN
    dbms_output.put_line('one enquals two');
   ELSE
    dbms_output.put_line('NOTHING WORKED');
 END CASE;
END;
 
提示:
可以省去TRUE(因為他是預設選擇符),但最好不要這樣做,這樣做可使程式碼更清楚。
 
 
PL/SQL支援數值FOR迴圈和遊標FOR迴圈。數值FOR迴圈在定義的範圍內迭代,而遊標FOR迴圈實在SELECT語句遊標返回的杭中迭代。
數值FOR迴圈具有下列原型:
FOR I IN starting_number..ending_number LOOP
 Statement;
END LOOP;
starting_number 和ending_number必需為整形。
下列例項程式顯示1――10的索引值:
BEGIN
 
 FOR i IN 1..10 LOOP
  dbms_output.put_line('the index value is ['|| i ||']');
 END LOOP;
 
END;
遊標FOR迴圈需要一個區域性定義的CURSOR。不能使用遊標FOR迴圈迭代引用遊標(REF CURSOR)。因為要迭代引用遊標,只能使用顯示迴圈結構,如簡單迴圈和WHILE迴圈。
他具有下列原型:
FOR i IN {cursor_name[(parameter1, parameter(n+1))] | (sql_statement)} LOOP
 Statemengt;
END LOOP;
下面演示瞭如何在FOR迴圈中編寫顯示遊標,並使用可下載指令碼播種的資料:
DECLARE
 CURSOR c IS SELECT OBJECT_NAME FROM lianxi l;
BEGIN
  FOR i IN c LOOP
   dbms_output.put_line('the title is [' || i.OBJECT_NAME || ']' );
  END LOOP;
  
END;
下面演示瞭如何在FOR迴圈中編寫隱式遊標,並使用可下載指令碼播種的資料:
BEGIN
 FOR i IN (SELECT OBJECT_NAME FROM lianxi l) LOOP
  dbms_output.put_line('the title is [' || i.OBJECT_NAME || ']' );
 END LOOP;
END;
簡單迴圈:
簡單迴圈是顯示結構。他們要求使用者管理迴圈索引和推出條件。簡單迴圈一般與區域性定義遊標語句和引用遊標(REF CURSOR)一起使用。
Oracle提供 6個遊標特性來幫助管理迴圈中的活動。其中4個遊標特性是%FOUND,%NOTFOUND,%ISOPEN和%ROWCOUNT.
下列所示為簡單迴圈的原型,使用了顯示CURSOR:
OPEN cursor_name[(paramenter1, paramenter(n+1))];
LOOP
FETCH cursor_name
 INTO row_structure_variable  | column_variable1 [,column_variable(n+1)];
  EXIT WHEN CURSOR%NOTFOUND;
  STATEMENT;
END LOOP;
CLOSE CURSOR_NAME;
下列程式模擬了對lianxi表執行遊標FOR迴圈:
DECLARE
 CURSOR c IS SELECT l.object_name FROM lianxi l;
 title lianxi.object_name%TYPE;
BEGIN
 
 OPEN c;
 LOOP
  FETCH c INTO title;
  EXIT WHEN c%NOTFOUND;
  dbms_output.put_line('the title is [' || title || ']' );
 END LOOP;
 CLOSE c;
 
END;
WHILE迴圈
WHILE迴圈不同於簡單迴圈,因為它檢查進入迴圈的條件而不是推出。它設定進入控制條件(entry  guard)為前置條件表示式。只有在控制條件滿足時,才能進入迴圈。
基本語法如下:
OPEN  cursor_name [(paramenter1, paramenter(n+1))];
WHILE condition LOOP
 FETCH  cursor_name
 INTO row_structure_variable | column_variable1[,column_variable(n+1)];
  EXIT WHEN cursor_name%NOTFOUND;
  Statement;
END LOOP;
CLOSE cursor_name;
如果檢查一個開啟的CURSOR,哪WHILE條件將是cursor_name%ISOPEN.
下列程式碼演示瞭如何將%ISOPEN遊標特性用於控制進入條件:
DECLARE
 CURSOR c IS SELECT l.object_name FROM lianxi l;
 titel lianxi.object_name%TYPE;
BEGIN
 OPEN c;
 WHILE c%ISOPEN LOOP
  FETCH c INTO titel;
  IF c%NOTFOUND THEN
   CLOSE c;
  END IF;
  dbms_output.put_line('the title is [' || titel || ']' );
 END LOOP;
 
END;
 
 
 
 
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-660035/,如需轉載,請註明出處,否則將追究法律責任。

相關文章