|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Bonjour à tous,
soit une table ENTREE au format imposé: Soit un ensemble d'algorithmes F que je dois appliquer à chaque ligne de signature type: Code :
F(VAL1,VAL2,...,VALN) RETURNS VAL1res,VAL2res,...,VALnRes compliquée je réalise ces algos en PL/SQL avec des fonctions type: sinon le code serait difficilement maintenable. Mon code ressemble donc à un truc du style: Code :
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, |
||
|
|
00
|
|
|
#2 | ||||
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Pour
Code :
Le plan d'exécution est: Code :
|
||||
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Pense tu que c'est vraiment une bonne idée de packager les valeurs dans une collection pour les dépackager ensuite ?
Si tu as besoin d'une requête dynamique utilise le SQL dynamique! |
|
|
00
|
|
|
#4 | |
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Citation:
A vrai dire... je me vois pas écrire une fonction qui itère sur des noms de colonnes directement non... Il me semble que d'un point de vue pérénité du code, c'est plus chouette d'avoir un tableau - sur lequel une fonction itère une à plusieurs fois pour faire ces opérations (genre opération mathématique sur un vecteur) , non ? Malheureusement j'ai l'impression qu'il n'y a pas de bonne solution avec SQL et PL/SQL... Les appels successifs à nth_element( ) coutent très cher étant donné les piètres performances du PL/SQL... Les temps: pour passer d'une table avec VARRAY à la table équivalente avec le tableau éclaté sur chaque colonne (en appelant la fonction nth_element 10 fois pour les 10 éléments du tableau). Temps = 2 minutes pour 1 200 000 lignes. Une requête qui éclate un objet équivalent (object composé de 10 Number) en SQL via la fonction TREAT(.. as obj).n1 est 4 fois plus rapide... Dommage qu'une chose aussi basique comme tableau(i) ne soit pas là en SQL mais que en PL/SQL... |
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
|
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Bonjour et Merci,
étant assez débutant je n'ai jamais utilisé ce package... j'y jette un oeil... j'imagine que tu parles de dbms_sql.describe_columns(c, col_cnt, rec_tab); par exemple... Celà me force t'il a faire du curseur ? |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Je pensait plutôt a DBMS_SQL.DEFINE_COLUMN.
Voilà un exemple de procédure PL/SQL qui utilise le package DBMS_SQL pour exécuter des requêtes SQL sans connaître combien des colonnes elle contient (l'algorithme est générique). Je ne comprends pas bien ta question sur le curseur: quand t'exécute un select il y a un curseur implicite qui est crée. |
|
|
00
|
|
|
#8 | |
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Citation:
Quand je parlais de curseur au dessus je parlais du fait de coder explicitement la boucle de parcours des lignes .. Niveau performance je sais pas ce que ça donnera par rapport au create as select... mais par contre je passe plus par des varray intermédiaires. Je testerai tout ça demain |
|
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : mai 2007 Messages : 37 ![]() |
Celà fonctionne mais à l'utilisation c'est pas si pratique que ça...
Merci à toi mnitu. Je note le sujet en résolu |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com