在Oracle中格式化(或提供字符串)异常消息

3

Oracle数据库中存在参数化错误消息。例如,在oraus.msg中有01919、00000、"角色'%s'不存在"等错误消息。 如果一个人发出一些无意义的GRANT ... TO ...,%s将被这个不存在的权限替代。 是否可以引发异常-1919并提供一些字符串给%s?

代码:

not_system_privilege EXCEPTION;
    PRAGMA EXCEPTION_INIT(not_system_privilege, -01919);
.......
RAISE not_system_privilege;

只会产生ORA-01919: 角色“”不存在的错误信息。

2个回答

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部分,我们可以放置任何内容。将错误记录在表格或文件中,引发警报等操作都是可行的。最佳实践是向上传播异常:只有调用堆栈的最高层 - 面向用户的层级 - 不应该抛出异常。


谢谢回复,但是UTL_LMS似乎更符合我的需求。 - J.L.

1
一个观察 - 看起来你可以使用 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,则此方法将无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接