1. ホーム
  2. oracle

[解決済み] Oracle PL/SQL - カスタムSQLERRMでユーザー定義例外を発生させる

2023-06-14 22:32:50

質問

ユーザー定義の例外を作成し、SQLERRMを変更することは可能でしょうか?

例えば

DECLARE
    ex_custom       EXCEPTION;
BEGIN
    RAISE ex_custom;
EXCEPTION
    WHEN ex_custom THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

出力は "User-Defined Exception" です。 このメッセージを変更することは可能でしょうか?

編集:以下、もう少し詳しく説明します。

この1枚で、私がやろうとしていることがよりよくわかると思います。

DECLARE
    l_table_status      VARCHAR2(8);
    l_index_status      VARCHAR2(8);
    l_table_name        VARCHAR2(30) := 'TEST';
    l_index_name        VARCHAR2(30) := 'IDX_TEST';
    ex_no_metadata      EXCEPTION;
BEGIN

    BEGIN
        SELECT  STATUS
        INTO    l_table_status
        FROM    USER_TABLES
        WHERE   TABLE_NAME      = l_table_name;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            -- raise exception here with message saying
            -- "Table metadata does not exist."
            RAISE ex_no_metadata;
    END;

    BEGIN
        SELECT  STATUS
        INTO    l_index_status
        FROM    USER_INDEXES
        WHERE   INDEX_NAME      = l_index_name;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            -- raise exception here with message saying
            -- "Index metadata does not exist."
            RAISE ex_no_metadata;
    END;

EXCEPTION
    WHEN ex_no_metadata THEN
        DBMS_OUTPUT.PUT_LINE('Exception will be handled by handle_no_metadata_exception(SQLERRM) procedure here.');
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

実際には、これらのサブブロックは何十個もあります。 サブブロックごとに個別のユーザー定義例外を作成するのではなく、それらのサブブロックごとに単一のユーザー定義例外を発生させ、異なるメッセージを表示させる方法はないかと考えています。

.NETでは、このようなカスタム例外を持つようなものでしょう。

    public class ColorException : Exception
    {
        public ColorException(string message)
            : base(message)
        {
        }
    }

そして、メソッドならこのようなものになります。

        if (isRed)
        {
            throw new ColorException("Red is not allowed!");
        }

        if (isBlack)
        {
            throw new ColorException("Black is not allowed!");
        }

        if (isBlue)
        {
            throw new ColorException("Blue is not allowed!");
        }

どのように解決するのですか?

はい。 RAISE_APPLICATION_ERROR 関数を使うだけです。 例外の名前も付けたい場合は EXCEPTION_INIT プラグマを使って、エラー番号と名前をつけた例外を関連付ける必要があります。 次のようなものです。

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    ex_custom EXCEPTION;
  3    PRAGMA EXCEPTION_INIT( ex_custom, -20001 );
  4  begin
  5    raise_application_error( -20001, 'This is a custom error' );
  6  exception
  7    when ex_custom
  8    then
  9      dbms_output.put_line( sqlerrm );
 10* end;
SQL> /
ORA-20001: This is a custom error

PL/SQL procedure successfully completed.