Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/06/2011, 15h48   #1
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 79
Points : 26
Points : 26
Par défaut Lenteur d'exécution d'une fonction (avec curseur)

Bonjour,

J'ai un comportement bizarre avec une fonction PL/SQL ! Cette fonction contient un curseur :

Code :
1
2
CURSOR  cur_table_1 IS
SELECT * FROM TABLE_1;
Puis j'ouvre ce curseur pour faire mon traitement :

Code :
1
2
3
4
5
 
FOR v_cur_table_1 IN cur_table_1
LOOP
  /*Mon traitement ici...*/
END LOOP;
Jusque là tout est normal !!! Le problème survient lors de l'ouverture de ce curseur : 30 min pour récupérer les données sachant que la table ne contient que 16 lignes, de plus, lorsque j'exécute la requête SELECT dans un éditeur, elle ne prend même pas 1 seconde pour retourner le résultat !

Petite précision : l'appel de ma fonction se fait à travers un

Code :
SELECT * FROM TABLE ( ma_fonction_PLSQL() );
Quelqu'un peut-il me proposer une solution ?

Merci par avance
labolabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 16h23   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Et /*Mon traitement ici...*/, il ne fait rien ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 16h24   #3
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
il faudrait toutes les informations, en commençant par la version, le script de cette fameuse fonction (parce qu'optimisé à l'aveugle, c'est comme prévoir la fin du monde la semaine prochaine ), le DDL des tables, etc...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 17h20   #4
Nouveau Membre du Club
 
Inscription : mai 2009
Messages : 79
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 79
Points : 26
Points : 26
Salut,

La version Oracle est : 10.2.0.4.0

Le traitement se limite a un simple contrôle :

Code :
1
2
3
4
5
6
7
8
9
10
 
FOR v_cur_table_1 IN cur_table_1
LOOP
 
    IF  v_cur_table_1.selected = 'Y'
    THEN
        dbms_output.put_line('Numéro de la ligne : ' || v_cur_table_1.line_number);
    END IF;
 
END LOOP;
J'ai même fait ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
FOR v_cur_table_1 IN cur_table_1
LOOP
 
    /*IF  v_cur_table_1.selected = 'Y'
    THEN
        dbms_output.put_line('Numéro de la ligne : ' || v_cur_table_1.line_number);
    END IF;*/
    NULL;
 
END LOOP;
J'ai encore attendu 30 min pour que la requête se termine (avec un résultat vide bien sûr).

Le programme se bloque sûrement à la ligne suivante :

Code :
FOR v_cur_table_1 IN cur_table_1
parce que si je vide la table et que je relance la requête, tout se passe bien !! c'est quand il y a des données que tout ralenti !!
labolabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 10h01   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Un jeu d’essai complet ? Allez le create table, les inserts de 16 lignes et votre fonction ce n’est pas la mer à boire.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h40   #6
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
bonjour,

Pourquoi ce :
Code :
SELECT * FROM TABLE ( ma_fonction_PLSQL() );
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h14   #7
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Ta procédure doit bien faire autre chose à part cette boucle, non ?
Et si tu enlèves carrément ta boucle ?
Et si tu vides la table de 16 lignes ?

Sinon, tu peux essayer de tracer pour voir ce qu'il attend...
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h57   #8
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Citation:
Envoyé par pacmann Voir le message
Salut !

Ta procédure doit bien faire autre chose à part cette boucle, non ?
Et si tu enlèves carrément ta boucle ?
Et si tu vides la table de 16 lignes ?

Sinon, tu peux essayer de tracer pour voir ce qu'il attend...
Salut ,

il a déjà répondu aux trois premières questions...
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 07h29   #9
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ben je dois être bigleux... je veux bien que tu me montres où ! (attention ça se cache dans le détail, mais c'est important)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h34.


 
 
 
 
Partenaires

Hébergement Web