加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle PL/SQL – 使用自定义SQLERRM提高用户定义的异常

发布时间:2020-12-12 14:34:54 所属栏目:百科 来源:网络整理
导读:是否可以创建用户定义的异常并能够更改SQLERRM? 例如: DECLARE ex_custom EXCEPTION;BEGIN RAISE ex_custom;EXCEPTION WHEN ex_custom THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);END;/ 输出为“用户定义的异常”。是否可以更改该消息? 编辑:这里有一些更多的
是否可以创建用户定义的异常并能够更改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!");
        }
是。您只需使用RAISE_APPLICATION_ERROR函数。如果还想命名异常,则需要使用EXCEPTION_INIT pragma命令将错误号与命名异常相关联。就像是
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读