1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| CREATE OR REPLACE FUNCTION bricole(liste varchar2) RETURN varchar2
IS
fragment varchar2(4000);
pos_virgule number(4);
val_virgule varchar2(2);
suite varchar2(4000);
pos_pct number(4);
val_pct varchar2(10);
couleur varchar2(30);
couleur_fmt varchar2(30);
resultat varchar2(4000);
begin
-- condition de terminaison
IF liste IS NULL then
RETURN '';
end IF;
-- découpage
pos_virgule:=instr(liste, ',');
IF pos_virgule=0 then
pos_virgule:=length(liste) + 1;
end IF;
fragment:=substr(liste, 1, pos_virgule-1);
-- on ne prend ni la virgule, ni l'espace qui la suit
suite:=substr(liste, pos_virgule + 2);
IF suite IS NOT NULL then
val_virgule:=', ';
else
val_virgule := '';
end IF;
-- traitement du premier fragment
pos_pct:=instr(fragment, '%');
val_pct:=substr(fragment, 1, pos_pct + 1);
couleur:=substr(fragment, pos_pct + 2);
couleur_fmt:=translate(lower(REPLACE(couleur, ' ', '-')), 'àÀäÄâÂéÉèÈëËêÊ', 'aaaaaaeeeeeeee');
resultat:=val_pct || '<a href="lien_' || couleur_fmt || '.htm">' || couleur || '</a>';
-- appel récursif sur la suite de la chaîne
RETURN resultat || val_virgule || bricole(suite);
end; |