Bonjour à tous,

soit une table ENTREE au format imposé:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ENTREE: CLE, VAL1,VAL2,...,VALn
Soit un ensemble d'algorithmes F que je dois appliquer à chaque ligne de signature type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
F(VARRAY) RETURNS VARRAYres
sinon le code serait difficilement maintenable.

Mon code ressemble donc à un truc du style:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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,