暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 多重动态替换

ASKTOM 2019-06-08
635

问题描述

嗨,
您能否看一下以下情况:

我有一个要求,其中我需要从单个字符串中替换具有不同值的多个单词,为此,我们有一个称为 “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将价值/替换对链接在一起。变成类似的东西:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论