エラー・コードとエラー・メッセージの取得

例外ハンドラの中では、処理中の例外について次のことを実行できます。

  • 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に示すとおり、これらの値をまずローカル変数に代入します。

関連項目:

例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;
/