例外処理

  事前定義の例外



  
 ★ CURSOR_ALREADY_OPEN     ORA-06511	-6511	

   すでにオープンされているカーソルをオープンしようとしたときに呼び出されます。
   オープンするためには、カーソルを一度クローズしなければなりません。

   カーソルFORループは、参照するカーソルを自動的にオープンします。このため、カ
   ーソルがすでにオープンされているときはループに入ることができません。また、
   ループの内側でカーソルをオープンすることもできません。


 ★ DUP_VAL_ON_INDEX        ORA-00001	-1	

   一意索引によって制約されているデータベース列に、重複した値を格納しようとす
   ると呼び出されます。


 ★ INVALID_CURSOR          ORA-01001	-1001	

   不正なカーソル操作を実行しようとすると呼び出されます。たとえば、オープンさ
   れていないカーソルをクローズしようとすると、INVALID_CURSORが呼び出されます。


 ★ INVALID_NUMBER          ORA-01722	-1722	

   文字列が正しい数値を表していなかったために、文字列から数値への変換が失敗し
   た場合に、そのSQL文の中で呼び出されます。たとえば、次のINSERT文では、Oracle
   が'HALL'を数値に変換しようとしたときにINVALID_NUMBERが呼び出されます。

   INSERT INTO emp (empno, ename, deptno) VALUES ('HALL', 7888, 20);

   プロシージャ文では、INVALID_NUMBERの代わりにVALUE_ERRORが呼び出されます。


 ★ LOGIN_DENIED            ORA-01017	-1017	

   不正なユーザー名/パスワードでOracleにログオンしようとしたときに呼び出され
   ます。


 ★ NO_DATA_FOUND           ORA-01403	+100	

   SELECT INTO文が行を戻さなかった場合、またはPL/SQL表の初期化されていない行を
   参照しようとした場合に呼び出されます。

   AVG、SUMなどのSQLグループ関数は、常に値またはNULLを戻します。したがって、グ
   ループ関数を呼び出すSELECT INTO文では、NO_DATA_FOUNDが呼び出されることはあ
   りません。

   NO_DATA_FOUNDはSELECT INTO文が行を戻さなかったときに呼び出されるので、
   SQL%NOTFOUNDの値は例外ハンドラでしか検査できません。しかし、
   カーソル名%NOTFOUNDの値はFETCHの実行後であれば検査できます。そのうちにFETCH
   は行を戻さなくなりますが、その場合でも例外は呼び出されません。


 ★ NOT_LOGGED_ON           ORA-01012	-1012	

   OracleにログオンしていないPL/SQLプログラムがデータベース・コールを発行した場
   合に呼び出されます。


 ★ PROGRAM_ERROR           ORA-06501	-6501	

   PL/SQLに内部的な問題点が発生した場合に呼び出されます。


 ★ STORAGE_ERROR           ORA-06500	-6500	

   PL/SQLのメモリーが足りない場合、またはメモリーが破壊されている場合に呼び出さ
   れます。


 ★ TIMEOUT_ON_RESOURCE     ORA-00051	-51	

   Oracleがリソースを求めて待機しているときにタイムアウトが発生した場合に呼び出
   されます。


 ★ TOO_MANY_ROWS           ORA-01422	-1422	

   SELECT INTO文が複数の行を戻した場合に呼び出されます。


 ★ TRANSACTION_BACKED_OUT  ORA-00061	-61	

   一般には、トランザクションのリモート部分が暗黙的または明示的にロールバックさ
   れたときに呼び出されます。いくつかのノードでOracleデータに矛盾が生じている可
   能性があるため、トランザクションをロールバックする必要があります。このときは、
   ROLLBACK文でトランザクションをロールバックし、もう一度実行してください。この
   章の「トランザクションの再試行」の節を参照してください。


 ★ VALUE_ERROR             ORA-06502	-6502	

   算術エラー、変換エラー、切り捨てエラーまたは制約エラーが発生した場合に呼び出
   されます。たとえば、切り捨てられた文字値がPL/SQL変数に代入されるとVALUE_ERROR
   が呼び出されます。(しかし、切り捨てられた文字値がホスト変数に代入された場合に
   は、例外は呼び出されません)。

   プロシージャ文では、文字列から数値への変換が失敗した場合にVALUE_ERRORが呼び出
   されます。たとえば、次の代入文では、PL/SQLが'HALL'を数値に変換しようとしたと
   きにVALUE_ERRORが呼び出されます。

   DECLARE
       my_empno  NUMBER(4);
       my_ename  CHAR(10);
   BEGIN
       my_empno := 'HALL';
       ...

   SQL文では、VALUE_ERRORの代わりにINVALID_NUMBERが呼び出されます。


 ★ ZERO_DIVIDE             ORA-01476	-1476	

   数値をゼロで割ろうとしたときに呼び出されます。
  



  呼び出された例外の処理



  
   例外が呼び出されると、PL/SQLブロックまたはサブプログラムの通常の
   実行は中止され、制御が例外処理部に移ります。例外処理部の書式を次
   に示します。

   ...
   EXCEPTION

      WHEN exception_name1 THEN
         sequence_of_statements1

      WHEN exception_name2 THEN
         sequence_of_statements2
      ...
      WHEN OTHERS THEN
         sequence_of_statements3

   END;

   呼び出された例外を処理するには、例外ハンドラを作成しなければなり
   ません。個々のハンドラは、例外を指定するWHEN句に、その例外が呼び
   出されたときに実行される一連の文を続けたものです。

#**********************************************
# これらの文を最後に、ブロックまたはサブプログラムの実行は終わりま
# す。制御は例外が呼び出された箇所に戻りません。つまり、処理を中止
# した位置から再開することはできません。
#**********************************************

   PL/SQLでは、処理を続行できるような例外はサポートされていません。
   しかし、1つの文に対して例外の処理を行い、次の文から処理を続けるこ
   とはできます。次の例に示すように、文を、独立した例外ハンドラを持
   つ独立したサブブロックに入れます。

   DECLARE
      pe_ratio  NUMBER(3,1);
   BEGIN
      DELETE FROM stats WHERE symbol = 'XYZ';
      ---------------- beginning of sub-block ----------------
      BEGIN
        SELECT price / NVL(earnings, 0) INTO pe_ratio FROM stocks
           WHERE symbol = 'XYZ';
        EXCEPTION
          WHEN ZERO_DIVIDE THEN
            pe_ratio := 0;
      END;
      ------------------- end of sub-block -------------------

      INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);

      EXCEPTION
         ...
   END;

   2つ以上の例外で、同じ文の並びを実行したい場合は、WHEN句の中でキ
   ーワードORで区切って例外名を並べてください。次に例を示します。

   EXCEPTION

      WHEN exception_name1 OR sequence_of_statements2 THEN
         sequence_of_statements1

      WHEN exception_name3 THEN
         sequence_of_statements2


   例外ハンドラの中ではローカル変数とグローバル変数だけが参照できま
   す。しかし、カーソルFORループの内側で例外が呼び出されると、ハンド
   ラに制御が移る前にカーソルは暗黙的にクローズされます。したがって、
   ハンドラでは明示カーソル属性の値を参照することができません。


  



  EXCEPTION_INITの使用

  
   無名の内部例外を処理するには、OTHERSハンドラかEXCEPTION_INIT
   プラグマを使用する必要があります。プラグマとは、コンパイラに
   対する命令の一つで、コンパイラに挿入されたコメントと見なされ
   ます。プラグマ(疑似命令とも言う)は、実行時ではなくコンパイル
   時に処理されます。プログラムの機能に影響を与えることはなく、
   コンパイラに情報を提供する役割しかありません。たとえば、Ada
   言語では、次のような定義済みのプラグマでコンパイラに指示を与
   え、ユーザーの記憶領域の使用方法を最適化します。

   pragma OPTIMIZE(SPACE);

   PL/SQLでは、事前定義のプラグマEXCEPTION_INITでコンパイラに指
   示して、例外名とOracleエラーの数値を対応付けます。この対応付
   けを行っておくと、内部例外を名前で参照して、専用のハンドラを
   作成することができます。

   EXCEPTION_INITプラグマは、PL/SQLブロック、サブプログラムまた
   はパッケージの宣言部で、次の構文を使って指定します。

   PRAGMA EXCEPTION_INIT(exception_name, ORACLE_error_number);

   exception_nameは、事前に宣言されている例外の名前です。プラグ
   マは同じ宣言部の例外宣言の後に指定しなければなりません。次に
   例を示します。

   DECLARE
      insufficient_privileges  EXCEPTION;
      PRAGMA EXCEPTION_INIT(insufficient_privileges, -1031);

   BEGIN
     ...

     EXCEPTION
       WHEN insufficient_privileges THEN
          ...
   END;
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ