0

我有以下包含错误代码和相关错误消息的表结构:

ERR_CODE    ERR_MESSAGE
CN001       Invalid Username :USERNM
CN002       Invalid Password :PWD

在我的 PLSQL 代码中,我想动态替换用户名和密码的值。

我知道 EXECUTE IMMEDIATE 可以通过 USING 子句进行替换,但在这种情况下查询必须是静态的。

我正在寻找一种类似于立即执行的风格,其中可以做到这一点:

SIMILAR_EXECUTE_IMMDIATE q'{select ERR_MESSAGE from ERROR_MESSAGES where ERR_CODE = 'CN001'}' INTO l_err_msg USING l_curr_user;

或者,也许我可以将其分解为 2 个步骤:

select ERR_MESSAGE into err_msg_var from ERROR_MESSAGES where ERR_CODE='CN001';

EXECUTE_IMMDIATE err_msg_var INTO l_err_msg USING l_curr_user;

基本上,我正在尝试减少所涉及的步骤数量,或者可能获得性能更好的查询或方法。

提前致谢 !

4

2 回答 2

2

不,execute immediate在这种情况下,声明将无济于事。此外,实际上没有必要使用它——一切(选择列表、表名)在编译时都是已知的,它只归结为字符串替换。使用静态查询,而不是动态查询。为了进行替换(或字符串格式),您至少有两个选择:

  1. 只需使用replace()功能:

    set serveroutput on;
    clear screen;
    
    declare
       l_result varchar2(50);
    begin
       select err_message
         into l_result
         from error_messages
        where err_code = 'CN001';
    
       dbms_output.put_line(replace(l_result, ':USERNM', 'new value')); 
    end;
    

    结果:

    Invalid Username new value
    
  2. 如果可能的话,通过替换和其他类似的子字符串来更新表的err_message列,这些子字符串用(字符文字的占位符)或(整数文字的占位符,如果有的话)表示占位符,并使用utl_lms包和具体功能:error_messages:USERNM:PWD%s%dformat_message()

    set serveroutput on;
    clear screen;
    
    declare
      l_result varchar2(50);
    begin
      select err_message
        into l_result
        from error_messages
       where err_code = 'CN001';
    
      dbms_output.put_line(
         utl_lms.format_message(l_result, 'new_value_goes_here')
       ); 
    end;
    

    结果:

    Invalid Username new_value_goes_here
    
于 2014-02-18T06:10:12.367 回答
0

您可以通过 SELECT 从表中获取 ERR_MESSAGE 并将 userName 或 PWD 附加到它。下面是一个片段。

select ERR_MESSAGE into err_msg_var from ERROR_MESSAGES where ERR_CODE='CN001';
dbms_output.put_line(err_msg_var||l_curr_user)

dbms_output如果要将其定义为函数,则可以返回值。

于 2014-02-18T06:03:47.380 回答