エラー・コードとエラー・メッセージの取得
例外ハンドラの中では、処理中の例外について次のことを実行できます。
-
PL/SQLファンクション
SQLCODE
を使用してエラー・コードを取得できます。このファンクションの詳細は「SQLCODEファンクション」を参照してください。 -
次のいずれかを使用してエラー・メッセージを取得できます。
-
PL/SQLファンクション
SQLERRM
(詳細は「SQLERRMファンクション」を参照)このファンクションは最大512バイトを戻します。これは、Oracle Databaseエラー・メッセージ(エラー・コード、ネストされたメッセージおよび表や列の名前などのメッセージの挿入部分を含む)の最大長です。
-
パッケージ・ファンクション
DBMS_UTILITY
.FORMAT_ERROR_STACK
(詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください)このファンクションは最大2000バイトの完全なエラー・スタックを戻します。
FORALL
文をSAVE
EXCEPTIONS
句とともに使用する場合以外は、例13-13に示すとおり、DBMS_UTILITY
.FORMAT_ERROR_STACK
を使用することをお薦めします。 -
SQL文では、SQLCODE
またはSQLERRM
を起動できません。これらの値をSQL文で使用するには、例12-23に示すとおり、これらの値をまずローカル変数に代入します。
関連項目:
-
サブプログラムがouterスコープの例外ハンドラから呼び出された場合でも、例外が発生した場所のコール・スタックを表示する
DBMS_UTILITY
.FORMAT_ERROR_BACKTRACE
関数の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 -
UTL_CALL_STACK
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。このパッケージのサブプログラムにより、現在実行中のサブプログラムのサブプログラム名などの情報が提供されます
例12-23 SQLCODEおよびSQLERRMの値の表示
DROP TABLE errors; CREATE TABLE errors ( code NUMBER, message VARCHAR2(64) ); CREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS name EMPLOYEES.LAST_NAME%TYPE; v_code NUMBER; v_errm VARCHAR2(64); BEGIN SELECT last_name INTO name FROM EMPLOYEES WHERE EMPLOYEE_ID = -1; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1, 64); DBMS_OUTPUT.PUT_LINE ('Error code ' || v_code || ': ' || v_errm); /* Invoke another procedure, declared with PRAGMA AUTONOMOUS_TRANSACTION, to insert information about errors. */ INSERT INTO errors (code, message) VALUES (v_code, v_errm); RAISE; END; /