Oracle数据库中存在参数化错误消息。例如,oraus.msg中有01919,00000,“role'%s'不存在”。 如果一个问题是一些废话GRANT ... TO ...%s被这个不存在的特权所取代。 可以引发异常-1919并将一些字符串提供给%s?
代码:
not_system_privilege EXCEPTION;
PRAGMA EXCEPTION_INIT(not_system_privilege, -01919);
.......
RAISE not_system_privilege;
仅生成ORA-01919: role '' does not exist
条消息。
答案 0 :(得分:3)
用户定义异常的目的是我们可以在PL / SQL程序的异常部分中捕获特定异常并优雅地处理它们。例如,如果我们在你的代码片段周围放一些肉......
create or replace grant_priv
( p_priv in varchar2
, p_grantee in varchar2 )
is
not_system_privilege EXCEPTION;
PRAGMA EXCEPTION_INIT(not_system_privilege, -01919);
begin
execute immediate 'grant '||p_priv||' to '||p_grantee;
exception
when not_system_privilege then
raise_application_error(-20000, p_priv||' is not a real privilege', true);
when others then
raise;
端;
我们可以在EXCEPTIONS部分放置任何内容。将错误记录在表或文件中,引发警报等等。优良做法是向上传播异常:只有callstack的最顶层 - 面向用户的层 - 不应该抛出异常。
答案 1 :(得分:0)
观察 - 看起来你可以使用utl_lms.format_message进行C风格的打印 - 希望我早些时候知道这一点(因为它会保存它)。似乎只是Ora10及以上。
begin
dbms_output.put_line(
utl_lms.format_message(
'A %s is here and a %s is there and a %s too','Giraffe','Lion','Spider'));
end;
我看不出任何满足OP要求的方法 - 提升系统级异常并替换正确的参数。
但是,如果你可以使用不同的异常编号,你可以编写自己的异常处理程序
a)接受所需例外的序列 b)使用utl_lms.get_message检索文本 c)使用format_message替换参数 d)使用生成的文本
引发用户定义的异常问题是如果你的调用系统需要一个ORA-01919,这将不起作用。