ユーザー定義の例外を作成して、SQLERRM を変更することはできますか?
例えば:
DECLARE
    ex_custom       EXCEPTION;
BEGIN
    RAISE ex_custom;
EXCEPTION
    WHEN ex_custom THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
出力は「ユーザー定義の例外」です。そのメッセージを変更することは可能ですか?
編集:ここにいくつかの詳細があります。
これが私がより良くしようとしていることを示していることを願っています.
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!");
        }