使用动态值填充列的占位符

时间:2014-02-18 00:50:46

标签: oracle plsql oracle11g substitution execute-immediate

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

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;

或许我可以分解为两步:

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;

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

提前致谢!

2 个答案:

答案 0 :(得分: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_messageerror_messages更新:USERNM表的:PWD列,其他类似的子字符串表示占位符{{ 1}}(字符文字的占位符)或%s(如果有的话,为整数文字的占位符)并使用utl_lms包,特别是%d函数:

    format_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;
    

答案 1 :(得分: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的值。