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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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