|
|
★ 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ループの内側で例外が呼び出されると、ハンド
ラに制御が移る前にカーソルは暗黙的にクローズされます。したがって、
ハンドラでは明示カーソル属性の値を参照することができません。
| |
|
|
|
|
無名の内部例外を処理するには、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;
| |
|
|
|