Bonjour à tous,
soit une table ENTREE au format imposé:
ENTREE: CLE, VAL1,VAL2,...,VALn
Soit un ensemble d'algorithmes F que je dois appliquer à chaque ligne de signature type:
F(VAL1,VAL2,...,VALN) RETURNS VAL1res,VAL2res,...,VALnRes
Comme ces algorithmes sont nombreux et doivent itérer sur la liste des (VAL1,...,VALn) parfois de manière
compliquée je réalise ces algos en PL/SQL avec des fonctions type:
F(VARRAY) RETURNS VARRAYres
sinon le code serait difficilement maintenable.
Mon code ressemble donc à un truc du style:
1 2 3 4 5 6 7 8
| CREATE TABLE SORTIE AS
SELECT cle,
nth_element(res,1) as VAL1res,
nth_element(res,2) as VAL2res,
nth_element(res,n) as VALnRes
FROM (
SELECT cle, F(to_varray(val1,val2,...,valn) ) as res FROM ENTREE)temp
); |
où: nth_element(res,n) est une fonction PL renvoyant le Nème élément du VARRAY et to_varray(val1,val2,...,valn) est une fonction PL renvoyant le varray [val1,val2,...,valn].
Ce qui m'ennuie le plus c'est la requête englobante - avec les nth_element(res,1) - car elle force Oracle à re-parcourir le jeu de résultats de la sous-requête temp. La table entrée peut être volumineuse (1 500 000 lignes).
Peut-on éviter cela ? Ou quelqu'un a t'il une meilleure idée ? (j aimerai éviter les curseurs) .
Merci d'avance pour votre aide,
Partager