HOME > PL/SQL(例外部)編
PL/SQL(例外部)
例外処理部のEXCEPTIONキーワード以下に記述する構文です。「このエラーが発生したらこの処理を行いなさい」という感じで記述していきます。
例外処理部構文
EXCEPTION構文 | |
---|---|
全てのエラーに対して同じ処理をする場合 |
WHEN OTHERS THEN 処理; |
特定のエラーに対してのみ処理をする場合 |
WHEN 例外名称 [OR 例外名称..] THEN 処理; |
特定のエラーに対してのみ特別な処理をする場合 |
WHEN 例外名称 THEN 処理; WHEN OTHERS THEN 処理; |
例外名称、エラーコード、SQLメッセージコード
例外にはエラー名称とエラーコードが付けられていて、例外名称によってEXCEPTION構文では処理を振り分けます。例えばデータが見つからないという例外をキャッチしたい場合は「NO_DATA_FOUND」を指定します。
判定にはエラーコードやSQLメッセージコードを使うときもあります。
例外名称 | 例外メッセージ | ORACLE エラー |
SQL メッセージ |
---|---|---|---|
ACCESS_INTO_NULL | 参照しているコンポジットは初期化されていません。 | ORA-06530 | -6530 |
COLLECTION_IS_NULL | 参照しているコレクションは初期化されていません。 | ORA-06531 | -6531 |
CURSOR_ALREADY_OPEN | PL/SQL: カーソルはすでにオープンしています。 | ORA-06511 | -6511 |
DUP_VAL_ON_INDEX | 一意制約(.)に反しています | ORA-00001 | -1 |
INVALID_CURSOR | カーソルが無効です。 | ORA-01001 | -1001 |
INVALID_NUMBER | 数値が無効です。 | ORA-01722 | -1722 |
LOGIN_DENIED | ユーザー名/パスワードが無効です: ログオンは拒否されました | ORA-01017 | -1017 |
NO_DATA_FOUND | データが見つかりません。 | ORA-01403 | +100 |
NOT_LOGGED_ON | ログオンされていません。 | ORA-01012 | -1012 |
PROGRAM_ERROR | PL/SQL: プログラム・エラーが発生しました | ORA-06501 | -6501 |
ROWTYPE_MISMATCH | PL/SQL: Result Set変数、または問合せの戻り型が一致しません | ORA-06504 | -6504 |
STORAGE_ERROR | PL/SQL: 記憶域エラーが発生しました | ORA-06500 | -6500 |
SELF_IS_NULL | NULL SELF引数のメソッド・ディスパッチは使用できません | ORA-30625 | -30625 |
SUBSCRIPT_BEYOND_COUNT | サブスクリプトがカウントを超過しています | ORA-06533 | -6533 |
SUBSCRIPT_OUTSIDE_LIMIT | サブスクリプトが有効範囲外です。 | ORA-06532 | -6532 |
SYS_INVALID_ROWID | ROWIDが無効です。 | ORA-01410 | -1410 |
TIMEOUT_ON_RESOURCE | リソースの待機中に、タイムアウトが発生しました。 | ORA-00051 | -51 |
TOO_MANY_ROWS | 完全フェッチが要求よりもよりも多くの行を返しました | ORA-01422 | -1422 |
VALUE_ERROR | PL/SQL: 数値または値のエラーが発生しました | ORA-06502 | -6502 |
ZERO_DIVIDE | 除数がゼロです。 | ORA-01476 | -1476 |
NO DATA FOUND エラーのみSQLメッセージコードが+(プラス)なのでご注意ください。
各Exceptionは以下のような感じで拾うことができます。
- EXCEPTION例文
- BEGIN --こんな感じの検索をすると仮定する SELECT COL1 INTO col FROM TEST_TABLE WHERE KEY1 = 999; EXCEPTION WHEN NO_DATA_FOUND THEN --検索結果ゼロ件の場合の処理をここに書く WHEN OTHERS THEN --検索結果ゼロ件以外のExceptionの場合の処理をここに書く END;
関数
プロシージャ内でEXCEPTIONが発生した後に、発生したEXCEPTIONのエラーコードやエラーメッセージを取得したい場合は以下の変数名で取得できます。
EXCEPTION関連変数 | |
---|---|
SQLCODE | エラーコードを返す |
SQLERRM | エラーメッセージを返す |
- 例)SQLCODEとSQLERRMを使うサンプル
-
CREATE OR REPLACE PROCEDURE TEST( o_sqlcode OUT NUMBER ,o_sqlerrm OUT VARCHAR2 ) IS a NUMBER; BEGIN --例外を発生させる a := 10 / 0; EXCEPTION WHEN OTHERS THEN o_sqlcode := SQLCODE; o_sqlerrm := SQLERRM; END TEST;