问题描述
嘿,
对于用户定义的异常,我们必须支持多语言错误消息。我们的工作原型看起来像这样:
当然,if语句内部的所有代码都可以放在一个单独的过程中,例如 “raise_application_error_i18n”...
但是我们真正想要并且应该非常舒适的是以这种简单的形式提出例外:
并得到当前NLS语言设置对应的错误信息...
我们如何实现这一目标?Oracle如何在内部实现这一点?
对于用户定义的异常,我们必须支持多语言错误消息。我们的工作原型看起来像这样:
-- 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中调用该语言逻辑。
我会考虑将错误消息存储在表中,将代码和语言映射到文本。例如:
这允许您添加/删除/更改消息而无需更改代码。并将 (可能很多) if分支替换为:
因此,您还可以创建一个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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




