Bon, l'autre jour, mon chef me demandait : sais tu pallindromer une chaîne de caractères sans fonction PL ?
... merci google, il y a une built-in fonction :)
1) Fonction REVERSE
Attendez, un petit jeu de test d'abord :
SQL> CREATE TABLE testrev(txt VARCHAR2(255));
Table crÚÚe.
SQL> INSERT INTO testrev VALUES ('marcel');
1 ligne crÚÚe.
SQL> INSERT INTO testrev VALUES ('robert');
1 ligne crÚÚe.
SQL> INSERT INTO testrev VALUES ('cosmetic sql is good for
you');
1 ligne crÚÚe.
SQL> commit;
Validation effectuÚe.
Et hop :
SQL> SELECT txt, reverse(txt) rev
2 FROM testrev;
TXT
REV
marcel
lecram
robert
trebor
cosmetic sql is good for
you uoy rof doog si lqs citemsoc
Surprise, ça marche !
Mais bon, c'est pas très drôle, disons le.
EDIT : et en plus la fonction n'est pas supportée, et elle est limitée dans un certain nombre de cas (Cf. le commentaire de Laurent)
Ben on va essayer de le faire à la main quand même !
2) Encore de la clause MODEL !
Alors, dans la mesure où on est capable de faire de l'itératif avec la clause MODEL, on devrait y arriver :
Il suffit d'itérer, pour chaque ligne, sur la longueur de la chaine, et construire le résultat.
SQL> SELECT txt, rev
2 FROM (
3 SELECT txt, length(txt) lng, length(txt) cnt
4 FROM testrev
5 ) t
6 MODEL
7 PARTITION BY (ROWID)
8 DIMENSION BY (0 n)
9 MEASURES (txt, lpad(' ', lng) rev, lng, cnt)
10 RULES
11 ITERATE(1000000) UNTIL (cnt[0] = 0)
12 (
13 rev[0] = substr(rev[0], 1, iteration_number) || substr(txt[0], lng[0] - iteration_number, 1)
14 , cnt[0] = cnt[0] -1)
15 /
TXT
REV
cosmetic sql is good for
you uoy rof doog si lqs citemsoc
marcel
lecram
robert
trebor
La question que je me pose encore cela dit : mais à quoi ça sert de pallindromer ?
Pfiou, heureusement que ce blog ne sert à rien...