我有以下表格结构,其中包含错误代码和相关的错误消息:
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;
基本上,我正在努力减少所涉及的步骤数量,或者可能获得更好的查询或方法。
提前致谢!
答案 0 :(得分:2)
不,execute immediate
声明在这种情况下无济于事。除此之外,确实没有必要使用它 - 所有内容(选择列表,表名)在编译时都是已知的,它只能归结为字符串替换。使用静态查询,而不是动态。为了进行替换(或字符串格式化),您至少有两个选择:
只需使用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
如果可能,请通过替换err_message
和error_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
的值。