问题描述
嗨,
您能否看一下以下情况:
我有一个要求,其中我需要从单个字符串中替换具有不同值的多个单词,为此,我们有一个称为 “T” 的配置表,该表具有要替换为新值信息的值。
我希望根据 “T” 中 “REPLACE_CHARS” 参数的条目动态创建嵌套替换。
在这种情况下,它将是3个嵌套的替换语句:
relace(replace(input_str,'PENDING','PEND'),'FAILED','ERR'),'COMPLETE','COM')
一旦这个动态嵌套语句创建,我可以在我的SQL/PLSQL resultset的迭代中使用它。
你能帮我吗?
您能否看一下以下情况:
我有一个要求,其中我需要从单个字符串中替换具有不同值的多个单词,为此,我们有一个称为 “T” 的配置表,该表具有要替换为新值信息的值。
CREATE TABLE "SCOTT"."T"
( "NAME" VARCHAR2(30 BYTE),
"VALUE" VARCHAR2(30 BYTE),
"DESC" VARCHAR2(2000 BYTE)
) ;
Insert into T (NAME,VALUE,DESC) values ('REPLACE_CHARS','COMPLETE','COM');
Insert into T (NAME,VALUE,DESC) values ('REPLACE_CHARS','PENDING','PEND');
Insert into T (NAME,VALUE,DESC) values ('REPLACE_CHARS','FAILED','ERR');
commit;我希望根据 “T” 中 “REPLACE_CHARS” 参数的条目动态创建嵌套替换。
在这种情况下,它将是3个嵌套的替换语句:
relace(replace(input_str,'PENDING','PEND'),'FAILED','ERR'),'COMPLETE','COM')
一旦这个动态嵌套语句创建,我可以在我的SQL/PLSQL resultset的迭代中使用它。
你能帮我吗?
专家解答
您可以使用listagg将价值/替换对链接在一起。变成类似的东西:
然后可以添加到SQL语句中:
但是要小心!像这样动态生成SQL是SQL注入攻击的主要目标。
CREATE table "T" (
"NAME" VARCHAR2(30 BYTE),
"VALUE" VARCHAR2(30 BYTE),
"REP" VARCHAR2(2000 BYTE)
) ;
Insert into T (NAME,VALUE,REP) values ('REPLACE_CHARS','COMPLETE','COM');
Insert into T (NAME,VALUE,REP) values ('REPLACE_CHARS','PENDING','PEND');
Insert into T (NAME,VALUE,REP) values ('REPLACE_CHARS','FAILED','ERR');
commit;
var val varchar2(30);
exec :val := 'COMPLETE FAILED REPLACE';
select listagg (
'replace ( ', ''
) within group ( order by 1 )
|| '''' || :val || ''', '
|| listagg (
'''' || value || ''', ''' || REP || ''' ) ', ','
) within group ( order by value ) replacements
from t;
REPLACEMENTS
replace ( replace ( replace ( 'COMPLETE FAILED REPLACE', 'COMPLETE', 'COM' ) ,'FAILED', 'ERR' ) ,'PENDING', 'PEND' ) 然后可以添加到SQL语句中:
select replace ( replace ( replace ( 'COMPLETE FAILED REPLACE', 'COMPLETE', 'COM' ) ,'FAILED', 'ERR' ) ,'PENDING', 'PEND' ) str from dual; STR COM ERR REPLACE
但是要小心!像这样动态生成SQL是SQL注入攻击的主要目标。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




