equivalent de la fonction explode PHP en PL/SQL
Je travaille actuellement sur un projet utilisant une base de données Oracle 10g. Dans ce projet, tous les traitements sur les données sont effectués par le serveur de base de données (en PL/SQL) pour alléger le serveur applicatif qui ne s’occupe que de la couche de présentation.
Dans un des traitements PL/SQL j’ai eu besoin de transformer une chaine de caractères en un tableau de données. En PHP j’aurais utilisé la fonction explode. Malheureusement, cette fonction n’existe pas en PL/SQL.
J’ai effectué des recherches sur internet et j’ai trouvé quelques traitements PL/SQL qui semblaient implémenter l’équivalent de la fonction explode. Mais ces implémentations étaient très complexes pour ne pas dire incompréhensible.
J’ai donc décidé de réaliser moi même une fonction explode en PL/SQL. Pour cela, j’ai utilisé :
- les possibilité de récursivité d’oracle (instruction loop)
- la fonction instr qui permet de détecter la première position d’un ensemble de caractères dans une chaine
- la fonction substr qui permet de séparer une chaine en plusieurs
- les collections oracle
trêve de bavardage, voici le code de cette fonction :
extract_chaine varchar2(2000) := ”;
position number(3) := 0;
TYPE ARR_STRING is table of varchar2(64) index by binary_integer;
cur_idx number(3) := 1;
current_str varchar2(20000) := str;
BEGIN
Loop
— on determine la position du premier champ sepatateur
select instr(current_str, delimiter) into position from dual;
IF position > 0 THEN
– on isole le bout de chaine jusqu’au separateur
select substr(current_str, 1, position - 1) into extract_chaine from dual;
— on stocke dans le tableau resultat le bout de chaine
arr_res(cur_idx):=extract_chaine;
cur_idx:=cur_idx+1;
— on supprime la partie de chaine traitée
select substr(current_str, position + length(delimiter)) into current_str from dual;
END IF;
exit when position = 0;
end loop;
– on stocke dans le tableau resultat la dserniere occurence non traite dans la boucle
arr_res(cur_idx):=current_str;
RETURN arr_res;
END explode;
Voici un exemple d’appel de la fonction :
TYPE ARR_STRING is table of varchar2(64) index by binary_integer;
ret ARR_STRING;
BEGIN
ret := explode(’@;’, ‘val1@;val2@;val3@;val4@;val5@;val6@;val7@;val8@;val9′);
for i in 1..ret.count loop
dbms_output.put_line(ret(i));
end loop;
end;
Si on regarde en détail le code de la fonction:
- le paramètre str contient la chaine à traiter,
- la paramètre delimiter contient le caractère qui permet d’exploser la chaine en un tableau
- la variable arr_res définit une collection qui contiendra les différentes parties de la chaines traité
Il existe très certainement d’autres algorithmes permettant d’effectuer l’équivalent de la fonction explode, mais celui-ci à le mérite de fonctionner correctement et d’être relativement simple à comprendre.
N’hésitez pas à tester ce code et à me laisser vos remarques ou vos optimisations.













