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 :

Passage de variables dans requête SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut Passage de variables dans requête SQL
    Bonjour,

    J'ai un bloc pl/sql qui sélectionne plusieurs valeurs ,
    je voudrais dans ce même bloc récupérer ces valeurs
    pour lancer un autre SELECT :

    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
     
     
    set serveroutput on ;
    DECLARE 
     
    cursor cur is 
    SELECT parentid,count(parentid) FROM cms_infoobjects6 GROUP BY parentid having count(parentid)>100 ;
    res1 integer ;
    par1 number(10) ;
    Lc$Req varchar2(256);
     
    cur1 cur%rowtype ;
     
    Begin
     
    for cur1 in Cur
    loop
    par1 := cur1.parentid ;
    	exit when cur%notfound;
     
    Lc$Req:= 'SELECT count(*) from cms_infoobjects6 where parentid = '||par1  ; 
    execute immediate Lc$Req INTO res1 ;
    dbms_output.put_line (par1 || ' - ' || res1) ;
     
      end loop ;  
    end ;
    /
    résultat :

    SQL> @C:\Oracle\scripts\plsql\Req-BO.sql
    35399 - 140
    2448 - 138
    2386 - 149
    2212 - 128
    35400 - 141
    35351 - 133
    27 - 106
    546 - 360
    2461 - 193

    ProcÚdure PL/SQL terminÚe avec succÞs.

    SQL>
    requête voulue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COUNT(*) FROM CMS_InfoObjects6 WHERE ParentID IN (35400,35351,27,35399,2448....) OR ScheduleStatus = 3;
    je ne sais pas comment récupérer les parentid pour lancer cette derniere requête,
    je ne suis pas développeur et ne connais pas trop pl/sql .

    Pour ceux qui ont reconnu, ce sont des requêtes données par le support
    SAP pour trouver les reports posant problème dans le CMS de BO .

    cordialement

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Attention à la clause IN qui est limitée à 1000 entrées.
    Ta solution peut poser problème.

    Sinon tu peux aussi exécuter la requête voulues directement sans faire de boucles et de SQL dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT COUNT(*) 
    FROM cms_infoobjects6,
      (SELECT 
        parentid PID,
        count(parentid) Count_PID
      FROM cms_infoobjects6 
      GROUP BY parentid 
      HAVING count(parentid)>100)
    WHERE ParentID = PID
    OR ScheduleStatus = 3;
    Mais j'ai un doute quant à ta question et si j'y répond bien...

  3. #3
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    c'est bien cela mais curieusement le résultat n'est pas identique
    entre ta requête ( je ne maitrise vraiment pas les
    (select from ..select)) et le select ... where parentid in ..

    le but est de récupérer les parentsid puis la somme totale des lignes impactées et de creer un job qui enverra un mail quand le bloc renvoie
    quelque chose .

    merci

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    La différence provient peut-être de cette clause
    Qui est présente dans ta requête voulue mais pas dans le package que tu as posté

    A toi de voir s'il faut la conserver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT COUNT(*) 
    FROM cms_infoobjects6,
      (SELECT 
        parentid PID
      FROM cms_infoobjects6 
      GROUP BY parentid 
      HAVING count(parentid)>100)
    WHERE ParentID = PID
    OR ScheduleStatus = 3;
    ou pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COUNT(*) 
    FROM 
      (SELECT 
        parentid
      FROM cms_infoobjects6 
      GROUP BY parentid 
      HAVING count(parentid)>100);

  5. #5
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    j' ai besoin des deux , mais le résultat est différent :

    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
    37
    38
     
    SQL> SELECT parentid,count(parentid) FROM cms_infoobjects6 GROUP BY parentid HAVING count(parentid)>100 ;
     
      PARENTID COUNT(PARENTID)
    ---------- ---------------
         35399             140
          2448             138
          2386             149
          2212             128
         35400             141
         35351             133
            27             106
           546             360
          2461             193
     
    9 ligne(s) sÚlectionnÚe(s).
     
    SQL> select count(*) from cms_infoobjects6 where parentid in (35399,2448,2386,2212,35400,35351,27,546,2461) or schedulestatus=3 ;
     
      COUNT(*)
    ----------
          1490
     
    SQL> SELECT COUNT(*)
      2  FROM cms_infoobjects6,
      3    (SELECT
      4      parentid PID
      5    FROM cms_infoobjects6
      6    GROUP BY parentid
      7    HAVING count(parentid)>100)
      8  WHERE ParentID = PID
      9  OR ScheduleStatus = 3;
     
      COUNT(*)
    ----------
          1506
     
    SQL>
    curieux non ?

    cdlt

  6. #6
    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
    Tu peux aussi faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT parentid, COUNT(*) 
    FROM cms.cms_infoobjects6 a
    WHERE EXISTS (SELECT 1 FROM cms.cms_infoobjects6 b WHERE b.parentid = a.parentid HAVING COUNT(*)>100)
    OR ScheduleStatus = 3
    GROUP BY parentid

  7. #7
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Etrange oui...

    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(*) 
    FROM cms_infoobjects6 
    WHERE schedulestatus=3;
    te donne 2 ?


    Et celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(*)
    FROM cms_infoobjects6;

  8. #8
    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
    pour info, chez moi la requête de Scriuiw part dans les choux (des access full et des nested loop)... j'ai killé au bout de 2min, oracle en était en long ops à 0.22% => 19.000 sec remaining
    Bon, je n'ai pas la même volumétrie, mais la requête avec le EXISTS met moins de 15s

    En fait, c'est ta (Scriuiw) requête qui est fausse, dans le cas des ScheduleStatus = 3, tu récupère toutes les lignes de la sousrequete (nbparentid > 100)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM (SELECT 1 AS a FROM dual) t1,
    	(SELECT 1 AS b FROM dual UNION ALL SELECT 2 AS b FROM dual) t2
    WHERE t1.a = t2.b
    OR t1.a = 1
     
    A	B
    1	1
    1	2

  9. #9
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    résultat des requêtes :
    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
     
    SQL> SELECT count(*)
      2  FROM cms_infoobjects6
      3  WHERE schedulestatus=3;
     
      COUNT(*)
    ----------
             2
     
    SQL> SELECT COUNT(*)
      2  FROM cms_infoobjects6;
     
      COUNT(*)
    ----------
          6081
     
    SQL>
    SQL> select count(*)  from cms_infoobjects6 where parentid in (35399,2448,2386,2212,35400,35351,27,546,2461);
     
      COUNT(*)
    ----------
          1488
     
    SQL>
    tout aussi curieux ce résultat :
    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
     
    SQL> SELECT parentid, COUNT(*)
      2  FROM cms_infoobjects6 a
      3  WHERE EXISTS (SELECT 1 FROM cms_infoobjects6 b WHERE b.parentid = a.parentid HAVING COUNT(*)>100)
      4  OR ScheduleStatus = 3
      5  GROUP BY parentid;
     
      PARENTID   COUNT(*)
    ---------- ----------
          2448        138
         35399        140
          2386        149
          3284          1
          2212        128
         35351        133
         35400        141
           546        360
            27        106
            49          1
          2461        193
     
    11 ligne(s) sÚlectionnÚe(s).
     
    SQL>

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

Discussions similaires

  1. Variable dans requète sql
    Par vangru.o dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/04/2009, 20h21
  2. Inclure une variable dans requête SQL
    Par Mvu dans le forum Visual Studio
    Réponses: 2
    Dernier message: 04/07/2008, 09h13
  3. Problème Variable dans requête SQL
    Par maxime350 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/04/2008, 20h55
  4. register_global à on et variables dans requêtes SQL
    Par JackBeauregard dans le forum Langage
    Réponses: 4
    Dernier message: 14/09/2006, 16h00
  5. [MySQL] Introduire une variable dans requête SQL, insérer des données à la volée
    Par Ronan.f dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 29/04/2006, 22h10

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