ORACLE PL/SQL(例外部)編

オラクルちょこっとリファレンス

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;
ToTop