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 :

[Procédure Stockée] Sortie boucle curseur si Select ne renvoie plus de valeurs


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Procédure Stockée] Sortie boucle curseur si Select ne renvoie plus de valeurs
    Bonjour à tous,

    J'ai besoin de votre aide pour une procédure stockée.
    Cette procédure est appelée plusieures fois (dans une boucle) depuis un programme JAVA.

    Dans cette procédure, j'ai un curseur où je fais un select.
    Pour chaque appel à la Procédure, je parcours une partie des resultats obtenus.
    (ex au premier appel de la PS je recupere les 50 premieres lignes renvoyées par le curseur, au deuxieme appel les 50 suivants ... )

    Ma question est la suivante:

    Comment faire pour sortir de la boucle du curseur lorsque la requête ne renvoit plus de resultat?

    Le code ultra simplifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    create or replace
    PROCEDURE  PS ( Paramètres...)
    IS
        CURSOR C1 (C_IDE_CORB NUMBER ) IS
              SELECT ....
              FROM ....
              where    ....; 
     
       W_L1   C1%ROWTYPE;
     
    BEGIN
     
      FOR W_L1 in C1(W_IDE_CORB) LOOP
     
    --APPEL a 10 Procedure stockées differentes
     
        COMMIT;
     
      END LOOP;
     
    END;
    --- Fin de procédure.
    END PS;
    J'espère avoir été clair dans mes explications.

    Je vous remercie par avance de votre aide et du temps que vous pourrez me consacrer.

    Yohann

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vous parcourez votre curseur avec un for loop, vous sortez donc automatiquement du curseur lorsqu'il n'y a plus de lignes renvoyées.
    Quel est votre problème ?

    Pour info le commit dans la boucle est peut être douteux.

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de votre réponse.

    Le code étant vraiment beaucoup allégé, il est surement nécessaire d'éclaircir un peu les choses:

    Dans la boucle de parcours du curseur, j'appelle différentes procédures stockées et les résultats de ces appels sont insérés dans une table TEMPO. (d'où le commit en fin de boucle car en réalité juste avant ce commit, je test le compteur qui permet de savoir à quel ligne j'en suis sur les 50 a traiter. dès que les 50 lignes son traitées, je commit) .

    Le parcours du curseur ne se fait pas en une fois ( très gros volume de données à traiter) mais par pas de 50 (comme expliqué dans le post précédent).

    Dans la même procédure il y 'a à la suite du curseur C1, un curseur C2 qui reprend la totalité des enregistrements de la table TEMPO et qui les enrichis avec d'autres tables pour les insérer dans une table TEMP02.

    Ce que je cherche à faire, c'est de ne parcourir C2 uniquement lorsque tous les enregistrements renvoyés par C1 seront traités (dernier appel à la PS).
    Et, une fois C2 parcouru, renvoyer un code particulier, afin de stopper la boucle côté Java.

    Je ne sais pas si j'ai été très clair...

    Merci de votre aide.

  4. #4
    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
    Vous est en train de participer au concours (non officiel): "meilleur algorithme pour plomber les performances sur une base Oracle".

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut

    Et non, c'est même pas ça ! !

    Ce traitement est un traitement de l'entreprise dans laquelle je suis en alternance... Il y a justement de gros soucis de performances sur ce traitement!
    Je suis ouvert à toute propositions d'optimisations!! (Je suis malheureusement très mauvais avec tout ce qui touche aux bases de données...)

Discussions similaires

  1. Procédure stockée - Etat du curseur non valide
    Par carribean dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/11/2008, 14h57
  2. Tester une procédure stockée renvoyant un curseur
    Par david71 dans le forum PL/SQL
    Réponses: 14
    Dernier message: 26/08/2008, 12h50
  3. Execution procédure stockée avec un curseur
    Par simo333 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/10/2007, 11h00
  4. Optimisation Procédure stocké utilisant 2 curseurs
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/02/2007, 09h27
  5. Appel d'une procédure stockée avec un curseur
    Par lapanne dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/12/2006, 16h24

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