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 :

Traiter ligne par ligne le résultat d'une requête en PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 87
    Points : 70
    Points
    70
    Par défaut Traiter ligne par ligne le résultat d'une requête en PL/SQL
    Bonjour,

    je voudrais traiter le résultat d'une requête select * from ..., ligne par ligne, et pour chaque ligne, réaliser une action.
    Voici ci-dessous l'idée générale.
    Merci de votre aide.
    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
    SET ServerOutput ON;
    DECLARE
    	cursor op_imap is select * nom_table  where condition
    BEGIN
    	For i in op_imap
    	loop
    		If nom_champ in select nom_cham from nom_table2 where condition1
    		 Then
    			action1 where champ=nom_champ ;
    		Else
    			action2 where champ=nom_champ ;
            End if ;
     
    	End loop ;  
    END;
    /
    EXIT;

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 093
    Points : 28 381
    Points
    28 381
    Par défaut
    Pour l'utilisation d'un curseur dans un programme PL/SQL, tu peux te rapporter utilement à ce tutoriel
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    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,

    Oui, un curseur fera l'affaire.

    Est ce que tu as rencontré un problème?

  4. #4
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Je préfère éviter les curseurs quand je peux...

    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 MyProc (pParam Varchar2)  as
     TYPE         t_Char IS TABLE OF Varchar2(128);
     TYPE         t_Num IS TABLE OF Number;
     l_Name       t_Char;
     l_Age        t_Num;
    Begin
     
     Select Name,Age
    	 BULK COLLECT Into  l_Name,l_Age
     From   MyTable
     Where  Dept = pParam;
     
     if l_Name.FIRST is not null then
      FOR i IN l_Name.FIRST..l_Name.LAST Loop
        -- Ton traitement ici !  
        dbms_output.Put_line ('Name = '||l_Name(i)||  '  Age  ='||l_Age(i));
      End LOOP;
     End If;
     
    End;
    /
    Ça c'est plus rapide il me semble. Maintenant attention a la taille de ta table...

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par jkofr Voir le message
    J
    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
     
    Begin
     
     Select Name,Age
    	 BULK COLLECT Into  l_Name,l_Age
     From   MyTable
     Where  Dept = pParam;
     
     if l_Name.FIRST is not null then
      FOR i IN l_Name.FIRST..l_Name.LAST Loop
        -- Ton traitement ici !  
        dbms_output.Put_line ('Name = '||l_Name(i)||  '  Age  ='||l_Age(i));
      End LOOP;
     End If;
     
    End;
    /
    Jko
    Bonjour,

    Je voudrai juste savoir où se trouveraient le COMMIT et le ROLLBACK dans ce traitement de LOOP?

    Bien Cordialement

    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  6. #6
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Bonjour,

    Je voudrai juste savoir où se trouveraient le COMMIT et le ROLLBACK dans ce traitement de LOOP?

    Bien Cordialement

    Mohamed Houri
    Après le End If;

    Mais suis d'accord que ca dépend du traitement...
    Un commit ou un rollback dans la boucle te pose t'il un problème?

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par jkofr Voir le message
    Après le End If;

    Mais suis d'accord que ca dépend du traitement...
    Un commit ou un rollback dans la boucle te pose t'il un problème?

    Jko
    Bonsoir,

    Il aurait fallut qu'ils y soit dans le code pour que je puisse vous dire s'ils me posent problème ou pas.

    En attendant, puisque vous dites après le END IF c'est à dire en dehors de la LOOP, je dirai dans ce cas deux choses
    (a) c'est OK pour le COMMIT
    (b) j'aimerai avoir plus de détails sur le ROLLBACK


    Bien cordialement

    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  8. #8
    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
    Citation Envoyé par jkofr Voir le message
    Je préfère éviter les curseurs quand je peux...
    Ça c'est plus rapide il me semble. Maintenant attention a la taille de ta table...

    Jko
    Franchement, je ne vois pas l'intérêt, ni le gain de perf à passer par un tableau qui donc nécessite une affectation mémoire, puis un parcours.
    Ca n'a d'utilité que si tu veux de la persistance de résultat pour plusieurs traitements.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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 le bulk collect, ça diminue quand même les context switches...

    Si j'ai bien compris, avant 10g, le cursor implicite ne fait pas de bulk (alors qu'après, oui)

    http://asktom.oracle.com/pls/asktom/...:4696422878211

    Par contre, si tu veux faire du bulk, il vaut mieux l'intégrer dans la boucle avec du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OPEN...
    FETCH ... BULK COLLECT... LIMIT 100
    Et là, tu maîtrises ton allocation mémoire (vu que tu ne gagnes quasi rien à BULK COLLECT plus que 500 lignes)

    (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. Réponses: 4
    Dernier message: 25/02/2014, 14h41
  2. Traiter ligne par ligne le résultat d'une requête
    Par pupucette dans le forum PL/SQL
    Réponses: 40
    Dernier message: 22/05/2012, 14h31
  3. Affichage par "section" des résultats d'une requête
    Par tiboleo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/02/2010, 16h43
  4. Calcul ligne par ligne sur le résultat d'une requête
    Par CanardJM dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/04/2008, 13h06
  5. Réponses: 5
    Dernier message: 14/06/2006, 15h19

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