SQLCODE と SQLERRM
SQLCODE と SQLERRM の2つは特別な関数であり、デフォルトの呼び出しでは直前のエラーコードとエラーメッセージを戻す PL/SQL だけで使用できる関数である。
SQLCODE のエラーコードには正常終了も含まれているので SQL の実行などが正常に完了すると SQLCODE は 0 になる。
SQLERRM はエラーコードをパラメータにすることで該当するエラーメッセージのテンプレート(※)を戻す。
(※) エラーメッセージ内のスキーマやファイル名などの変化するフィールドが %p などの内部書式で格納されている。
SQLCODE
SQLCODE は 0(※) 〜 (マイナス) -65535 までが用意されている。
それ以外にも独自の PL/SQL 例外 (User-Defined Exception) として +1 、
さらに 事前定義例外 において +100 が割り当てられている例外も存在する。
(※) SQLCODE が 0 ということはエラーではなく正常終了していることをあらわしている。
正の領域については +1 と +100 以外は +1000 までは存在していないことは SQLCODE とエラーメッセージ一覧を作成するスクリプトで確認したが正確なところはよくわからない。+100 に関しては、旧 ANSI の標準 SQL の互換性から存在しているものらしい。(ORA-1403 と同じ)
なおエラーログ出力に利用するために SQLCODE,SQLERRM を DML 内で記述することはできず、以下のエラーメッセージが出力される。一旦、変数に入れてからバインド変数などにするなどの工夫が必要である。
PL/SQL: ORA-00984: ここでは列は使用できません。
SQLERRM
SQLERRM は直前に発生しているエラーメッセージが格納されている。
なお、SQLCODE を引数とした SQLERRM(SQLCODE) の呼び出しでは内部のパラメータ変数が展開処理されていないため SQLERRM とのメッセージの内容が一緒になるとは限らない。
エラー情報として十分な情報が得られない場合があるので注意する。
vMsg := SQLERRM; -- 内部の変数が展開される。
vMsg := SQLERRM(num); -- エラー番号 num のテンプレートメッセージを取得。
vMsg := SQLERRM(SQLCODE); -- テンプレートとしてのメッセージが戻される。
Oracle エラー・メッセージの最大長と上限 (SQLERRM の最大長)
PL/SQL ユーザーズ・ガイドおよびリファレンスには
Oracle エラー・メッセージの長さは、エラー・コードおよびネストされたメッセージ、
表や列の名前といったメッセージの挿入部分を含めて 512 文字以内です。
と表記があるが、システムとしてのエラーメッセージの上限ではないようである。(※)
(※) 内部における最大長を連想させる記述が SQL*Plus (制限事項) と RAISE_APPLICATION_ERROR にある上限の
2048 バイトである。
エラーメッセージをテーブルに保管している場合、カラム長は 2048 バイトで宣言しておけば、
まずオーバフローしないと思われる。
日本語環境においてメッセージ文字長(およびバイト)が一番長いのものを調べてみたところ、メッセージ内に可変する表現が含まれていないメッセージであり
ORA-36976: (XSRELGID00) GROUPINGIDコマンドの書式は次のとおりです:
GROUPINGID [relation1] INTO {variable | relation2 | surrogate}
[USING levelrelation] [INHIERARCHY {inhvariable | valueset}]
[LEVELORDER levelordervs]
ソース・リレーションを省略できるのは、サロゲートのグループIDおよびレベル順序値セット
の両方を使用している場合のみです。
の 269 文字 (342 バイト)であった。Shift-JIS (Oracle 10g 時点)
別の変数を含むエラーメッセージで、これ以上の長さのメッセージもあると思われる。
なお、このメッセージは 10g R1 以前の DBMS_OUTPUT パッケージ では
複数行に分割編集しなければエラーになり出力することはできない。
例外処理関連