格式化(或提供字符串)异常';oracle中的s消息

格式化(或提供字符串)异常';oracle中的s消息,oracle,exception-handling,plsql,oracle11g,Oracle,Exception Handling,Plsql,Oracle11g,Oracle数据库中存在参数化错误消息。例如,oraus.msg中有0191900000个“角色“%s”不存在”。 如果有人发出一些废话。。。至…%s被这个不存在的特权所取代。 是否可以引发异常-1919并向%s提供一些字符串 代码: 仅生成ORA-01919:角色“”不存在消息。用户定义异常的目的是我们可以在PL/SQL程序的异常部分捕获特定异常,并优雅地处理它们。例如,如果我们在您的代码片段周围放一些肉 create or replace grant_priv ( p_priv i

Oracle数据库中存在参数化错误消息。例如,oraus.msg中有0191900000个“角色“%s”不存在”。 如果有人发出一些废话。。。至…%s被这个不存在的特权所取代。 是否可以引发异常-1919并向%s提供一些字符串

代码:


仅生成
ORA-01919:角色“”不存在
消息。

用户定义异常的目的是我们可以在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;
结束


我们可以把任何东西放在例外部分。在表格或文件中记录错误,发出警报,等等。向上传播异常是一种很好的做法:只有调用堆栈的最顶层(面向用户的层)不应该抛出异常

一个观察结果-看起来您可以使用utl_lms.format_消息进行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;
我看不出有任何方法可以满足OPs要求——提出系统级异常并替换正确的参数

然而,如果您可以接受使用不同的异常号,那么您可以编写自己的异常处理过程,该过程可以

a) 接收所需异常的序列号 b) 使用utl_lms.get_消息检索文本 c) 使用format_消息在参数中替换 d) 使用生成的文本引发用户定义的异常


问题是,如果您的呼叫系统需要ORA-01919,这将无法工作。

谢谢您的回复,但UTL_LMS似乎更适合我的要求。
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;