Oracle中PL/SQL的執行部分和各種流程式控制制

來源:互聯網
上載者:User

標籤:

 

Oracle中PL/SQL的執行部分和異常部分

一.PL/SQL的執行部分。

  • 指派陳述式。

    指派陳述式分兩種,一種是定義一個變數,然後接收使用者的IO賦值;另一種是通過SQL查詢結果賦值。

    使用者賦值舉例:  

set serveroutput on;accept abc prompt ‘請輸入abc的值‘;DECLARE     a int:= &abc;BEGIN     dbms_output.put_line(a);END;

    查詢賦值舉例: 

set serveroutput on;DECLARE  str varchar2(20);BEGIN  select ename into str from emp where empno=‘7369‘;  dbms_output.put_line(str);END;
  • 流程式控制制語句。

    PL/SQL的主要控制語句如下:

      1.if...then      elsif … then      end if;

        判斷if正確則執行then,否則執行else(elsif為嵌套判斷)

        注意elsif,裡面少一下e.

      2.Case  var  when … then    when … then   end

        有邏輯的從數值中做出選擇

      3.Loop     exit    end loop

        迴圈控制,用判斷語句執行exit

      4.Loop       exit when …        end loop

        同上,當when為真時執行exit

      5.while..loop         end loop

        當while為真時迴圈

      6.for...in...loop        end loop

        已知迴圈次數的迴圈

    因為流程式控制制比較多,在這裡就不一一舉執行個體了,寫幾個比較經典的程式給大家看一下。

    ********列印9*9乘法表*********

        for in..loop

set serveroutput on;DECLARE  i number;  j number;BEGIN for i in 1..9 loop  for j in 1..i loop    dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘  ‘);  end loop;  dbms_output.put_line(‘‘); end loop;END;

        while  loop

set serveroutput on;declare  i number:=1;  j number:=1;begin  while i<10 loop    while j<=i loop      dbms_output.put(i||‘*‘||j||‘=‘||(i*j)||‘  ‘);      j:=j+1;    end loop;    i:=i+1;    j:=1;    dbms_output.put_line(‘‘);  end loop;end;

  

    *********計算1+2+..+10的值*********

      loop exit  & loop exit when

set serveroutput on;                                declare  i number:=1;  i_sum number:=0;begin  loop    i_sum:=i_sum+i;    i:=i+1;    if i>10 then       exit;    end if;   end loop;  dbms_output.put(i_sum);  dbms_output.put_line(‘‘);                 end;

  注意:put只是把輸出結果放入緩衝區,直到遇到put_line時才會輸出。所以只有put的時候,不會顯示i_sum的結果。

  可以把 if i>10 then exit; end if;  換成exit when i>10;這樣就成為了loop ..exit when .. end loop 結構。

  *********輸入一個字元,判斷是字母、數字還是其他字元****************

     if then elsif else

set serveroutput on;declare i_char varchar2(2); begin  i_char:=&abc;  if regexp_like(i_char,‘^[a-z]$‘)   then    dbms_output.put_line(‘輸入的是字母‘);  elsif  regexp_like(i_char,‘^[0-9]$‘) then    dbms_output.put_line(‘輸入的是數字‘);  else    dbms_output.put_line(‘輸入的是其他字元‘);  end if;end;

    case  when

set serveroutput on;declare  i_char varchar2(2);  i_result varchar2(30);begin  i_char:=&abc;  i_result:=  case   when regexp_like(i_char,‘^[a-z]$‘)   then    ‘輸入的是字母‘  when regexp_like(i_char,‘^[0-9]$‘)   then    ‘輸入的是數字‘  else    ‘輸入的是其他字元‘  end;  dbms_output.put_line(i_result);end;

注意:在提示視窗中輸入的時候,字串一定要加單引號,否則就會出錯,本人每次在這裡都要拌一下。  

  •  SQL語句

  SQL語句就是資料庫查詢語句,比較簡單就不在這裡說了。

  •  遊標語句

 

 二.異常部分。

  資料庫中的異常跟java中的異常的機制和作用原理是一樣的,只是代碼和格式不一樣,資料庫中的異常分為三類:系統異常(預定義異常)、自訂異常以及引發應用程式異常。

  •   系統異常
     PL/SQL程式在運行過程中,可能會出現錯誤或異常現象

     例如:無法建立到Oracle的串連或用0做除數。好的程式應該對可能發生的異常情況進行處理,異常處理代碼在EXCEPTION塊中實現

     可以使用WHEN語句來定義異常。WHEN語句的使用方法如下:

      EXCEPTION

             WHEN <異常情況名> THEN

                   <異常處理代碼>

             WHEN <異常情況名> THEN

                 <異常處理代碼>

               ...

             WHEN OTHERS THEN

                <異常處理代碼>

    常見的系統異常

 

 

 

 異常名稱  異常碼 說明 
 NO_DATA_FOUND  ORA-01403 select into語句中沒有返回任何記錄 
 TOO_MANY_ROWS ORA-01422  select into語句中返回多行資料。 
 ZERO_DIVDE  ORA-01476 試圖用0作為除數。 
 DUP_VAL_ON_INDEX  ORA-00001 試圖向唯一索引列插入重複值 
 INVALID_CURSOR ORA-01001  試圖進行非法遊標操作。 
 CURSOR_ALREADY_OPEN ORA-06511  試圖開啟一個已經開啟的遊標。 
 INVALID_NUMBER ORA-01722  試圖將數字轉換為字串。 
 VALUE_ERROR    

在產生大小限制錯誤時出現。如,變數中的列值超出變數的大小


LOGIN_DENIED

   輸入的使用者名稱或者密碼無效時出現。

 

 

 

 

  •       自訂異常  

      當與一個異常錯誤相關的錯誤出現時,就會隱含觸發該異常錯誤。使用者定義的異常錯誤是通過顯式使用 RAISE 語句來觸發。當引發一個異常錯誤時,控制就轉向到 EXCEPTION塊異常錯誤部分,執行錯誤處理代碼。

      對於這類異常情況的處理,步驟如下:

      在PL/SQL 塊的定義部分定義異常情況:

      <異常名稱>  exception;

      在PL/SQL 塊的執行部分RAISE異常:

      RAISE <異常名稱>;

      在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。

      WHEN <異常名稱> THEN

        代碼... 

  •       引發應用程式異常

Oracle中PL/SQL的執行部分和各種流程式控制制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.