IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Lenteur d'exécution d'une fonction (avec curseur)


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Expert Oracle
    Inscrit en
    Mai 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Expert Oracle

    Informations forums :
    Inscription : Mai 2009
    Messages : 92
    Points : 70
    Points
    70
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CURSOR  cur_table_1 IS
    SELECT * FROM TABLE_1;
    Puis j'ouvre ce curseur pour faire mon traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE ( ma_fonction_PLSQL() );
    Quelqu'un peut-il me proposer une solution ?

    Merci par avance

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Et /*Mon traitement ici...*/, il ne fait rien ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Invité
    Invité(e)
    Par défaut
    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...

  4. #4
    Membre régulier
    Homme Profil pro
    Expert Oracle
    Inscrit en
    Mai 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Expert Oracle

    Informations forums :
    Inscription : Mai 2009
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    Salut,

    La version Oracle est : 10.2.0.4.0

    Le traitement se limite a un simple contrôle :

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

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Un jeu d’essai complet ? Allez le create table, les inserts de 16 lignes et votre fonction ce n’est pas la mer à boire.

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    bonjour,

    Pourquoi ce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE ( ma_fonction_PLSQL() );

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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/

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    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...

  9. #9
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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/

Discussions similaires

  1. [AC-2007] lenteur tableau croisé d'une requête avec fonction vba que faire ?
    Par rogerfon dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/07/2012, 21h42
  2. problème avec l'exécution d'une fonction
    Par b_reda31 dans le forum Images
    Réponses: 2
    Dernier message: 31/05/2008, 13h50
  3. [curseur] modification curseur pdt exécution d'une fonction javascript
    Par NikoBe dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 04/04/2007, 19h31
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo