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

SQL Oracle Discussion :

Pb boucle Oracle


Sujet :

SQL Oracle

  1. #1
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut Pb boucle Oracle
    Bonjour à tous,

    Je travaille sur Oracle, et j'ai une requete qui me pose probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT id, name, LEVEL, parent, name2
    FROM (select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2
    from ae6contact co, ae6contactlink cl, ae6contact co2
    where co.contact_group='ENTITE'
    and co.contact_id = cl.contact_id_from
    and cl.contact_role='FILIALE_DE'
    AND cl.status='N'
    AND co2.contact_id=cl.CONTACT_ID_TO)
    START WITH id = 18
    CONNECT BY id = PRIOR parent
    --ORDER BY LEVEL DESC
    UNION 
    select null, '', null, 18, 'Nom 18' from dual;
    Cette requete marche tres bien: Elle me donne les entreprises meres d'une societe donnee (id: 18)

    ce que je cherche à avoir c'est les resultats de toutes les entreprises dans un meme tableau avec une colonne en plus qui me donnerait l'id de l'entreprise dont la hierarchie est en cours.

    En gros je veux remplacer les '18' dans la requete par les resultats de la requete suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct clink.CONTACT_ID_FROM 
    from ae6contactlink clink 
    where (clink.CONTACT_ROLE='FILIALE_DE' OR clink.CONTACT_ROLE='GROUPE_DE')
    Il faut reussir à faire une boucle sur les resultats de la requete precedente. Ce que je n'arrive pas à faire marcher.

    Une petite aide svp?

    Merci d'avance pour vos conseils avisés

    Titip

  2. #2
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    Bonjour,

    Si tu peux faire une procédure pl/sql, utilise un curseur sur ton 'distinct clink.CONTACT_ID_FROM' et le tour est joué

    voili, voilou
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  3. #3
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    J'ai esssayé ca:

    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
    24
     
    DECLARE
    CURSOR cur IS
    	select distinct clink.CONTACT_ID_FROM from ae6contactlink clink where (clink.CONTACT_ROLE='FILIALE_DE' OR clink.CONTACT_ROLE='GROUPE_DE');
    	BEGIN
     
    	for rec in cur loop
     
    	SELECT id, name, LEVEL, parent, name2
    	FROM (select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2
    	from ae6contact co, ae6contactlink cl, ae6contact co2
    	where co.contact_group='ENTITE'
    	and co.contact_id = cl.contact_id_from
    	and cl.contact_role='FILIALE_DE'
    	AND cl.status='N'
    	AND co2.contact_id=cl.CONTACT_ID_TO)
    	START WITH id = rec.CONTACT_ID_FROM
    	CONNECT BY id = PRIOR parent
    	--ORDER BY LEVEL DESC
    	UNION 
    	select null, '', null, rec.CONTACT_ID_FROM, 'Nom 18' from dual;
     
    	END LOOP;
    END;
    Et ca ne marche pas, je ne suis pas sûr de la bonne utilisation des curseurs


  4. #4
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Là tu as pris un raccourci un peu trop court.

    Essaye avec un version un peu plus longue :

    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
    24
    25
    26
    27
    28
    29
    30
    31
     DECLARE
        CURSOR cur IS
         select distinct clink.CONTACT_ID_FROM 
         from ae6contactlink clink 
         where (clink.CONTACT_ROLE='FILIALE_DE' OR 
                clink.CONTACT_ROLE='GROUPE_DE');
        cursor c_detail( contactID ae6contact.contact_id%TYPE ) is
         SELECT id, name, LEVEL, parent, name2
         FROM ( select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2
               from ae6contact co, ae6contactlink cl, ae6contact co2
               where co.contact_group='ENTITE'
               and co.contact_id = cl.contact_id_from
               and cl.contact_role='FILIALE_DE'
               AND cl.status='N'
               AND co2.contact_id=cl.CONTACT_ID_TO)
         START WITH id = rec.CONTACT_ID_FROM
         CONNECT BY id = PRIOR parent
         --ORDER BY LEVEL DESC
         UNION 
         select null, '', null, rec.CONTACT_ID_FROM, 'Nom 18' from dual;
     
    BEGIN
     
     for rec in cur loop
         OPEN c_detail( rec.CONTACT_ID_FROM );
         FETCH c_detail INTO .. -- liste de variables locales
         CLOSE c_detail;
     
         -- Ici, tu manipules tes variables locales
     END LOOP;
    END;

  5. #5
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    titip,
    as tu une erreur dans ta procédure ?

    Si oui, à mon avis avec un execute immediate ça marchera mieux !
    ça devrais donner quelque chose comme ça :
    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
    DECLARE
    CURSOR cur IS
    	select distinct clink.CONTACT_ID_FROM from ae6contactlink clink where (clink.CONTACT_ROLE='FILIALE_DE' OR clink.CONTACT_ROLE='GROUPE_DE');
     
    vRequete VARCHAR2(4000);
    	BEGIN
     
    	for rec in cur loop
     
    vRequete := 'SELECT id, name, LEVEL, parent, name2' ||
    'FROM (select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2' ||
    'from ae6contact co, ae6contactlink cl, ae6contact co2' ||
    ... (pas envie de me tapez tout)
    || 'START WITH id =' || rec.CONTACT_ID_FROM ||
    ... (la suite);
     
    	execute immediate vRequete;
     
    	END LOOP;
    END;
    Si je suis pas trop rouillé, ça devrais marcher...

    Sinon, la solution de jproto fonctionne (bon ok j'ai pas tester), mais je suis pas trop pour les curseurs de curseurs... Je suis assez simple d'esprit et là c'est trop compliqué à relire

    voili, voilou
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  6. #6
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    POur kalyparker, Oui j'ai une erreur. J'ai essayé ta solution, et ca ne marche toujours pas...
    C'est peut etre mon code qui n'est pas bon

    Pour jproto,

    Ca marche nickel, merci. J'ai fait des petites modifs pour adapter à mes besoins. Mais j'ai toujours un soucis

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    DECLARE
    	a1 number(10);
     
    	CURSOR cur IS
    	select distinct clink.CONTACT_ID_FROM 
    	from ae6contactlink clink 
    	where (clink.CONTACT_ROLE='FILIALE_DE' OR clink.CONTACT_ROLE='GROUPE_DE');
        cursor c_detail( contactID ae6contact.contact_id%TYPE ) is
         SELECT id, name, LEVEL, parent, name2
         FROM ( select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2
               from ae6contact co, ae6contactlink cl, ae6contact co2
               where co.contact_group='ENTITE'
               and co.contact_id = cl.contact_id_from
               and cl.contact_role='FILIALE_DE'
               AND cl.status='N'
               AND co2.contact_id=cl.CONTACT_ID_TO)
         START WITH id = contactID
         CONNECT BY id = PRIOR parent
         --ORDER BY LEVEL DESC
         UNION 
         select null, '', null, co.contact_id, co.name from ae6contact co where co.contact_id=contactID;
     
     
    BEGIN
     
     for rec in cur loop
     	 a1 :=1;
         for machin in c_detail( rec.CONTACT_ID_FROM ) loop -- liste de variables locales
     
    	 insert into AEMTOTO values (machin.id,machin.name,machin.parent,machin.name2, rec.CONTACT_ID_FROM, a1);
    	 a1 := a1 + 1;
    	 end loop;
     
     END LOOP;
    END;
    Ce que je cherche à faire est de recuperer un tableau mais pas dans une table. En gros, il me faut un 'Select' quelque part pour m'afficher le resultat que je met dans la table AEMTOTO.

    Ce serait donc une requete qui me renvoie un tableau

    Quand je met select au lieu du INSERT, j'ai une erreur qui me dit qu'il me manque un INTO

    Une solution?

    En tout cas merci à tous les deux pour votre aide

  7. #7
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Tu le veux dans quoi ton résultat ?

    Si tu veux récupérer le résultat dans un tableau, il faut d'abord le créer.
    Bref, comment souhaites-tu exploiter les données récupérées ? (dans un fichier / dans une structure PL/SQL / dans un ensemble de variables)

  8. #8
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Je me suis mal exprimé en parlant de tableaux. je ne parlais pas de varables, mais dans un le flux de sortie d'un Select.
    Je ne connais pas bien le jargon, mais en gros, je veux le meme resultat qu'un select * from aemtoto.

    Parce que je n'ai pas la main sur la modification des tables (ou du moins je ne devrais pas avoir la main)

  9. #9
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Tu dois alors permettre l'édition en plaçant l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     set serveroutput on size 1000000
    avant ton block PL/SQL (ainsi qu'une série d'instructions "set" afin de correctement
    formater ton résultat).

    Puis dans ton code PL/SQL, tu écris ce que tu récupères du curseur :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     DECLARE
     a1 number(10);
     
     CURSOR cur IS
     select distinct clink.CONTACT_ID_FROM 
     from ae6contactlink clink 
     where (clink.CONTACT_ROLE='FILIALE_DE' OR clink.CONTACT_ROLE='GROUPE_DE');
     
        cursor c_detail( contactID ae6contact.contact_id%TYPE ) is
         SELECT id, name, LEVEL, parent, name2
         FROM ( select co.contact_id as id, co.name, cl.CONTACT_ID_TO as parent, co2.NAME as name2
               from ae6contact co, ae6contactlink cl, ae6contact co2
               where co.contact_group='ENTITE'
               and co.contact_id = cl.contact_id_from
               and cl.contact_role='FILIALE_DE'
               AND cl.status='N'
               AND co2.contact_id=cl.CONTACT_ID_TO)
         START WITH id = contactID
         CONNECT BY id = PRIOR parent
         --ORDER BY LEVEL DESC
         UNION 
         select null, '', null, co.contact_id, co.name from ae6contact co where co.contact_id=contactID;
     
    BEGIN
     
     for rec in cur loop
       a1 :=1;
         for machin in c_detail( rec.CONTACT_ID_FROM ) loop -- liste de variables locales
     
          dbms_output.put_line(machin.id||';'||machin.name||';'||machin.parent||';'||machin.name2||';'||rec.CONTACT_ID_FROM||';'||a1);
          a1 := a1 + 1;
      end loop;
     
     END LOOP;
    END;
    En t'y prenant ainsi, tu obtiens une sortie sous une forme CSV simpliste.

    Chris

  10. #10
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Ah cool merci beaucoup jproto, je n'ai plus qu'à modifier l'affichage comme il me faut, et c'est bon

  11. #11
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    J'ai une autre question à propos de l'affichage des resultats.

    Je ne pense pas que ça justifierait la création d'un nouveau sujet.

    Les resultats s'affichent (sur TOAD) dans le DBMS output

    alors que je cherche à l'afficher dans la partie datagrid (comme pour une requete de type Select )



    Sur quoi je travaille recupere les donnees en datagrid, et du coup, je ne peux pour l'instant pas

    Y aurait il une solution svp?

    Merci

  12. #12
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Tu dois pouvoir stocker tes resultats dans un tableau... et renvoyer ton tableau en retour de ton code PL/SQL

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    ou plus simplement le stocker dans une table temporaire et faire un SELECT * dessus. PL/SQL output

  14. #14
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par orafrance
    ou plus simplement le stocker dans une table temporaire et faire un SELECT * dessus. PL/SQL output
    Oui j'ai deja essayé, j'arrive à mettre les donnees dans une table temporaire (aemtoto pour ceux qui ont lu le code (post du 20/06/2007 17h45).
    mais je n'arrive pas à faire dans la meme procedure un select. J'ai un message d'erreur
    ORA-06550: line 35, column 2:
    PLS-00428: an INTO clause is expected in this SELECT statement

  15. #15
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    bah non, c'est après coup... tu lances ta procédure pour insérer les données, après tu exécutes la commande SELECT * dans une fenêtre SQL dans toad

  16. #16
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Oui justement, c'est ca mon probleme, je commence à me dire que ce n'est peut etre pas possible, mais j'ai besoin de mettre dans un progiciel multi utilisateur une requete qui donnerait la reponse en tableau en cliquant sur un bouton.
    Je ne peux pas faire vider la table la reremplir et apres lancer mon select sacahnt qu'en meme temps quelqu'un d'autre peut lancer la meme procedure pendant l'operation.

  17. #17
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Dans ce cas, il te faut une procedure ou mieux une fonction qui retourne le tableau de valeurs que tu souhaites...

    Tu peux définir une variable "tableau" qui stocke celà et le retourner en résultat.
    ex tab is TABLE OF ma_table%rowtype (pour définir la variable)

    return tab en instruction finale de ta fonction.

    Tu peux aussi retourner un curseur...

  18. #18
    Membre éclairé

    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Ok je vais essayer et je vous tiens au courant

    Merci en tout cas


    Probleme reglé, merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/05/2014, 17h24
  2. Boucle WHILE sous oracle
    Par GreenCard dans le forum SQL
    Réponses: 8
    Dernier message: 27/05/2009, 11h39
  3. [Oracle 9i] boucle et curseur
    Par Requin15 dans le forum Oracle
    Réponses: 18
    Dernier message: 20/06/2006, 19h32
  4. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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