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 :

Boucle SELECT d'un select


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut Boucle SELECT d'un select
    Bonjour,

    Je souhaiterais effectuer une boucle de SELECT sur un select.

    Genre :

    for ma_variable in (select NUMBERPRGN from T2 where STATUS='ordered' and assigned_dept='departt')
    loop
    select min(a.DATESTAMP),min(b.DATESTAMP) from (select NUMBER,TYPE,DATESTAMP,DESCRIPTION from T1 where NUMBER=ma_variable and DESCRIPTION='etat1') a, (select NUMBER,TYPE,DATESTAMP,DESCRIPTION from T1 where NUMBER=ma_variable and DESCRIPTION='etat2') b


    je n'ai pas trouver de solution ...

    j'ai très peu de connaissance PL/SQL ...

    D'avance merci pour vos conseil

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez d'expliquer votre besoin, de ce que je perçois vous n'avez pas besoin de passer par PL/SQL, une simple requête suffit.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    en PLSQL : un select doit toujours renvoyer ses valeurs dans des variables
    (SELECT .. INTO ... FROM ...)

    Attention à ta requête n° 2 .. Elle est pas du tout optimisée, voir dangereuse à utiliser car il y a un produit cartésien (pas de jointure)

    un exemple de boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
     v_date1 DATE, v_date2 DATE;
    BEGIN
     for r in (select NUMBERPRGN from T2 where STATUS='ordered' and assigned_dept='departt')
    loop
     select min(DATESTAMP) INTO v_date1
     FROM T1 where NUMBER=r.NUMBERPRGN  and DESCRIPTION='etat1';
     
     select min(DATESTAMP) INTO v_date2
     FROM T1 where NUMBER=r.NUMBERPRGN  and DESCRIPTION='etat2';
     
     --Traitement de v_date1 et v_date2
     
    END LOOP;

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut
    Le bloc PL/SQL me plait bien

    j'ai essayé :

    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
     
    DECLARE
     v_date1 DATE;
     v_date2 DATE;
    BEGIN
     FOR r IN (SELECT NUMBERPRGN FROM SC_DBA.OCMLM1 WHERE STATUS='ordered' AND assigned_dept='G_BEX_LOT6-GAZ-SYS-SN1')
    loop
     SELECT min(DATESTAMP) INTO v_date1
     FROM SC_DBA.EDFACTIVITY2M1 WHERE NUMBERPRGN=r.NUMBERPRGN  AND DESCRIPTION like '%affectation%vers G_BEX_LOT6-GAZ-SYS-SN1';
     
     SELECT min(DATESTAMP) INTO v_date2
     FROM SC_DBA.EDFACTIVITY2M1 WHERE NUMBERPRGN=r.NUMBERPRGN  AND DESCRIPTION like '%affectation%vers G_BEX_LOT6-SN1';
     
     --Traitement de v_date1 et v_date2
    DBMS_OUTPUT.PUT(v_date2 - v_date1) ;
    END LOOP;
    END;

    mais rien ne s'affiche ....

    voici le résultat de la première requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT NUMBERPRGN FROM SC_DBA.OCMLM1 WHERE STATUS='ordered' AND assigned_dept='G_BEX_LOT6-GAZ-SYS-SN1'
     
    Q00044976-001
    Q00033801-007
    Q00054457-005
    Q00056346-002
    Q00056346-001
    Q00056346-003
    Q00056747-001
    Q00063083-001
    Q00061801-001
    Et voici le résultat de v_date1 :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT min(DATESTAMP)
     FROM SC_DBA.EDFACTIVITY2M1 WHERE NUMBERPRGN='Q00044976-001'  AND DESCRIPTION like '%affectation%vers G_BEX_LOT6-GAZ-SYS-SN1';
     
     
    04/02/10
    Je devrai avoir un retour sur chaque occurrence de ma boucle non ?

  5. #5
    Expert confirmé 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
    Par défaut
    Citation Envoyé par Boudine Voir le message
    Le bloc PL/SQL me plait bien
    ...
    C’est inefficace. Ca revient à faire les jointures dans le code PL/SQL la où un simple SQL suffit. C’est un signe typique de mauvais code.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut
    Merci Waldar !! la requête répond a mon problème !

    Désolé de ne pas avoir expliqué plus clairement mon besoin. Je dferais plus de description dans mes prochaine demandes.

    Encore merci.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je m'autocite :
    Citation Envoyé par Waldar Voir le message
    Essayez d'expliquer votre besoin, de ce que je perçois vous n'avez pas besoin de passer par PL/SQL, une simple requête suffit.
    De ce que je vois, la requête suivante arrive au même résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      select oc.numberprgn,
             min(case when ed.description like '%affectation%vers G_BEX_LOT6-GAZ-SYS-SN1' then ed.datestamp end) as dt1,
             min(case when ed.description like '%affectation%vers G_BEX_LOT6-SN1'         then ed.datestamp end) as dt2
        from sc_dba.ocmlm1 oc
             inner join sc_dba.edfactivity2m1 ed
               on ed.numberprgn = oc.numberprgn
       where oc.status = 'ordered'
         and oc.assigned_dept = 'G_BEX_LOT6-GAZ-SYS-SN1'
         and (ed.description like '%affectation%vers G_BEX_LOT6-GAZ-SYS-SN1'
          or  ed.description like '%affectation%vers G_BEX_LOT6-SN1')
    group by oc.numberprgn;

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

Discussions similaires

  1. Utiliser une boucle "For" dans un" Select Case"
    Par Novice_vba dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/04/2014, 09h34
  2. Réponses: 1
    Dernier message: 12/11/2008, 10h45
  3. [firebird] sous select dans un select
    Par gdido dans le forum SQL
    Réponses: 2
    Dernier message: 14/05/2004, 09h57
  4. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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