|
|
|
|
例外処理 |
|
PL/SQL では、警告またはエラー条件を例外と呼びます。
エラー処理に例外を使用すると、コマンドを発行するたびに実行エラーを検査する必要がありません。また、エラー処理を通常の処理から明確に分離できます。
エラーが発生すると例外が呼び出されます。つまり、通常の実行は中止され、PL/SQL ブロックまたはサブプログラムの例外処理部に制御が移ります。
BEGIN
SELECT ...
SELECT ...
SELECT ...
... EXCEPTION
WHEN NO_DATA_FOUND THEN -- catches all 'no data found' errors
例 ティッカ・シンボルXYZ の企業について、株価収益率を計算し、格納しています。企業の収益がゼロの場合は、事前定義の例外ZERO_DIVIDE
が呼び出されます。このとき、ブロックの通常の実行は中止され、制御が例外ハンドラに移ります。ブロックで特に名前を指定していないすべての例外は、オプションのOTHERS
ハンドラで処理します。
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ'; -- might cause division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- exception handlers begin
WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
...
WHEN OTHERS THEN -- handles all other errors
ROLLBACK;
END; -- exception handlers and block end here
|
|
|
事前定義のPL/SQL 例外(内部例外) |
|
ACCESS_INTO_NULL
プログラムが未初期化(基本構造的にNULL)オブジェクトの属性に値を代入しようとしたとき。
CASE_NOT_FOUND
CASE 文のWHEN 句で何も選択されておらず、ELSE 句もない場合。
COLLECTION_IS_NULL
プログラムがEXISTS 以外のコレクション・メソッドを未初期化(基本構造的にNULL)のネストした表またはVARRAY に適用しようとしたか、または未初期化のネストした表またはVARRAY
の要素に値を代入しようとしたとき。
CURSOR_ALREADY_OPEN
すでにオープンされているカーソルをオープンしようとしたとき。カーソルをオープンするには、一度クローズする必要があります。カーソルFOR ループは、参照するカーソルを自動的にオープンします。このため、ループの内側ではカーソルをオープンできません。
DUP_VAL_ON_INDEX
UNIQUE 索引によって制約されているデータベース列に、重複した値を格納しようとしたとき。
INVALID_CURSOR
オープンされていないカーソルをクローズするなど、不正なカーソル操作を実行しようとしたとき。
INVALID_NUMBER
SQL 文の中で、文字列が正しい数値を表していなかったために、文字列から数値への変換が失敗したとき。(プロシージャ文では、VALUE_ERROR
が呼び出されます。)この例外は、バルクFETCH 文のLIMIT 句の式が正数に評価されない場合にも呼び出されます。
LOGIN_DENIED
不正なユーザー名/ パスワードでOracle にログオンしようとしたとき。
NO_DATA_FOUND
SELECT INTO 文が行を戻さなかったとき、ネストした表で削除された要素を参照したとき、または索引付き表で未初期化の要素を参照したとき。AVG
やSUM などのSQL 集計関数は必ず値またはNULL を戻します。したがって、集計関数をコールするSELECT INTO 文では、NO_DATA_FOUND
が呼び出されることはありません。FETCH 文は最終的には行を戻さないと予想されますが、その場合は、例外は呼び出されません。
NOT_LOGGED_ON
Oracle に接続していないプログラムが、データベース・コールを発行した場合。
PROGRAM_ERROR
PL/SQL に内部的な問題が発生した場合。
ROWTYPE_MISMATCH
1 つの代入の中に含まれるホスト・カーソル変数とPL/SQL カーソル変数の戻り型に互換性がない場合。たとえば、オープン・ホスト・カーソル変数をストアド・サブプログラムに渡すとき、実パラメータの戻り型と仮パラメータの戻り型には互換性が必要です。
SELF_IS_NULL
NULL インスタンスでMEMBER メソッドをコールしようとしたとき。つまり、組込みパラメータSELF がNULLである場合。このパラメータは、常にMEMBER
メソッドに最初に渡されるパラメータです。
STORAGE_ERROR
PL/SQL のメモリーが足りない場合、またはメモリーが破壊されている場合。
SUBSCRIPT_BEYOND_COUNT
コレクション中の要素数より大きい索引番号を使用してネストした表またはVARRAY の要素を参照した場合。
SUBSCRIPT_OUTSIDE_LIMIT
有効範囲外(たとえば-1)の索引番号を使用してネストした表またはVARRAY の要素を参照した場合。
SYS_INVALID_ROWID
文字列が正しいROWID を表していなかったために、文字列からユニバーサルROWID への変換が失敗した場合。
TIMEOUT_ON_RESOURCE
Oracle がリソースを求めて待機しているときにタイムアウトが発生した場合。
TOO_MANY_ROWS
SELECT INTO 文が複数の行を戻した場合。
VALUE_ERROR
算術エラー、変換エラー、切捨てエラー、 またはサイズ制約エラーが発生した場合。たとえば、列値を選択し文字変数に代入するときに、その値が変数の宣言された長さよりも長い場合、PL/SQL
はその割当てを異常終了させてVALUE_ERROR を呼び出します。プロシージャ文では、文字列から数値への変換が失敗した場合にVALUE_ERROR
が呼び出されます。(SQL 文では、INVALID_NUMBER が呼び出されます。)
ZERO_DIVIDE
数値をゼロで割ろうとしたとき。 |
|
ユーザー定義の例外 |
|
PL/SQL ブロック、サブプログラムまたはパッケージの宣言部で、ユーザー独自の例外を定義できます。ユーザー定義の例外はRAISE 文によって明示的に呼び出す必要があります。 |