エラー・コードとエラー・メッセージの取得
例外ハンドラの中では、処理中の例外について次のことを実行できます。
-
PL/SQLファンクション
SQLCODEを使用してエラー・コードを取得できます。このファンクションの詳細は「SQLCODEファンクション」を参照してください。 -
次のいずれかを使用してエラー・メッセージを取得できます。
-
PL/SQLファンクション
SQLERRM(詳細は「SQLERRMファンクション」を参照)このファンクションは最大512バイトを戻します。これは、Oracle Databaseエラー・メッセージ(エラー・コード、ネストされたメッセージおよび表や列の名前などのメッセージの挿入部分を含む)の最大長です。
-
パッケージ・ファンクション
DBMS_UTILITY.FORMAT_ERROR_STACK(詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください)このファンクションは最大2000バイトの完全なエラー・スタックを戻します。
FORALL文をSAVEEXCEPTIONS句とともに使用する場合以外は、例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;
/