2016-08-30 2 views
0

Ich schreibe eine Prozedur, die eine Reihe von Sonderzeichen durch eine andere Reihe von ihnen ersetzen müssen, die in einem Anwendungssystem akzeptiert werden. Wie kann ich die folgende Anweisung, die ich in der Prozedur verwende, besser umschreiben?Wie ersetze Befehl für mehrere Zeichen in PL/SQL

select  replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace('%BICI* "(MOTO), |X PLAY? 4G: RED&WHITE& \/<DIRETTA>','(','-'),'%','perc'),'?','.'),'|','-'),':',';'),',','.'),'<','-'),'>','-'),'&','and'),'\','-'),'/','-'),'"','-'),')','-'),'*','-') 
from dual; 

Ich kann eine rekursive Prozedur nicht verwenden. Irgendwelche Vorschläge?

Danke! Ilaria

+2

Sie können regexp_replace() verwenden. – XING

+0

Siehe meine Antwort [hier] (http://stackoverflow.com/a/28584627/319875) –

+0

Vielleicht kann diese Antwort Ihren Anforderungen entsprechen: http://StackOverflow.com/a/2947787/6773490 – tchibu

Antwort

0

Dies ist ein interessanter. Hier ist ein Arbeitsbeispiel basierend auf Florins Beispiel:

with trans_tbl(id, symbol, txt) as (
    select 1, '(', '-' from dual union 
    select 2, '%', 'perc' from dual union 
    select 3, '?', '.' from dual union 
    select 4, '|', '-' from dual union 
    select 5, ':', ';' from dual union 
    select 6, ',', '.' from dual union 
    select 7, '<', '-' from dual union  
    select 8, '>', '-' from dual union 
    select 9, '&', 'and' from dual union 
    select 10, '\', '-' from dual union  
    select 11, '/', '-' from dual union 
    select 12, '"', '-' from dual union 
    select 13, ')', '-' from dual union 
    select 14, '*', '-' from dual 
), 
data_tbl(str) as (
    select '%BICI* "(MOTO), |X PLAY? 4G: RED&WHITE& \/<DIRETTA>' from dual 
), 
working_tbl(str, id) as (
    SELECT str, 0 id 
    FROM data_tbl 
    UNION ALL 
    SELECT replace(working_tbl.str,symbol,txt), trans_tbl.id 
    FROM working_tbl 
    JOIN trans_tbl 
    ON working_tbl.id = trans_tbl.id - 1 
) 
--select str, id from working_tbl; 
SELECT str 
from working_tbl 
where id = (select max(id) 
      from trans_tbl); 

STR 
---------------------------------------------------------- 
percBICI- --MOTO-. -X PLAY. 4G; REDandWHITEand ---DIRETTA- 
Verwandte Themen