暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 取决于NLS的用户定义异常的多语言错误消息

ASKTOM 2020-09-09
232

问题描述

嘿,
对于用户定义的异常,我们必须支持多语言错误消息。我们的工作原型看起来像这样:

-- userdefinedexception package
create or replace package ude authid definer as
  c_example_number constant pls_integer:=-20105;
  c_example_msg_en constant utl.varchar2_m:='english error message...';
  c_example_msg_es constant utl.varchar2_m:='mensaje de error...';
  e_example exception;
  pragma exception_init(e_example, c_example_number);
end;
/
-- example usage 
begin
  raise ude.e_example;
exception
  when ude.e_example then
    if sys_context('userenv','language') like 'ENGLISH%' then
      raise_application_error(ude.c_example_number, ude.c_example_msg_en);
    else
      raise_application_error(ude.c_example_number, ude.c_example_msg_es);    
    end if;
end;
/
复制

当然,if语句内部的所有代码都可以放在一个单独的过程中,例如 “raise_application_error_i18n”...

但是我们真正想要并且应该非常舒适的是以这种简单的形式提出例外:
begin
  raise ude.e_example;
end;
复制

并得到当前NLS语言设置对应的错误信息...

我们如何实现这一目标?Oracle如何在内部实现这一点?

专家解答

如果要将错误消息附加到自定义错误代码,则无论如何都需要使用raise_application_error。如果加薪,除了错误号,你不会收到任何消息。

因此,您还可以创建一个raise_application_error_i18n来处理语言逻辑,并在raise_application_error中调用该语言逻辑。

我会考虑将错误消息存储在表中,将代码和语言映射到文本。例如:

create table err_messages (
  error_code    integer,
  language      varchar2(100),
  error_message varchar2(255)
);
复制


这允许您添加/删除/更改消息而无需更改代码。并将 (可能很多) if分支替换为:

select * from err_messages
where  error_code = sqlcode
and    language = sys_context('userenv','language');
复制

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论