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 :

Requêtes et traitement PL/SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut Requêtes et traitement PL/SQL
    Bonjour,

    J'ai une demande assez spécifique, je suis en train de chercher un moyen de faire un traitement avec 2 de mes requêtes PL/SQL directement dans une requête.

    Je m'explique, j'ai deux requêtes, une qui me récupère des informations d'une table, une autre qui me récupères d'autres informations d'une autre table.

    J'aimerai les mettre en relation et voir si TOUS les infos ressorti de ma requête 2 sont inclus dans le résultat de ma première requête.

    Si c'est le cas ma fonction retourne 1, sinon je renvoi 0.
    C'est au niveau du traitement que je bloque je vous donne mes deux requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t2.num_emplacement
    			FROM t2, t3
    			WHERE t2.num_emplacement = t3.code_emplacement
    			AND t3.type_emplacement = variable1;
    Requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t1.num_emplacement
    			FROM t1
    			WHERE t1.date_fin > (SELECT TO_DATE(sysdate) FROM dual);
    Merci d'avance.

  2. #2
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Ca devrait faire un truc approchant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select min(1, count(*) ) rstl
    from (  SELECT t2.num_emplacement
    	FROM t2, t3
    	WHERE t2.num_emplacement = t3.code_emplacement
    	AND t3.type_emplacement = variable1
            MINUS
            SELECT t1.num_emplacement
            FROM t1
            WHERE t1.date_fin > sysdate )
    Evitez tout de même les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where date > (select to_date(sysdate) from dual)
    , ça fait de la peine au relecteur

  3. #3
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bonjour,

    Tu veux faire une requête ou une fonction ?
    Car la démarche dans une fonction est plutôt simple, pour les requêtes une différence devrait suffire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaRequete1
    MINUS  
    MaRequete2

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Pas si specifique que ca, ce qu'il vous faut, c'est Minus et Cortex. Avec peut-etre un COUNT, ca evitera pas mal d'erreur a gerer (pas de lignes, ou trop de lignes), et simplement au lieu d'avoir 0 ou 1, vous avez 0 ou un nombre positif.

    [ame="http://www.youtube.com/watch?v=tdk8vfKhoug"]Générique Minus et Cortex - YouTube[/ame]

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    En gros j'aimerai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    OPEN c1 FOR
       SELECT XXXX
    CLOSE c1;
     
    OPEN c2 FOR
       SELECT XXXX
    CLOSE c2;
     
    // Bouclage sur c2
       // Bouclage sur c1
    // SI la valeur actuelle de c2 est trouvé dans c1 on continue
    // Si la valeur actuelle de c2 n'est pas dans c1 je retourne 0
    // On fini de boucler tant qu on arrive a trouver c2 dans c1
    // Si tout c1 a ete trouvé dans c2 on retourne 1
    PS : ojo77:
    pourquoi éviter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE date > (SELECT to_date(sysdate) FROM dual)
    ?

  6. #6
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par keegzer Voir le message
    En gros j'aimerai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    OPEN c1 FOR
       SELECT XXXX
    CLOSE c1;
     
    OPEN c2 FOR
       SELECT XXXX
    CLOSE c2;
     
    // Bouclage sur c2
       // Bouclage sur c1
    // SI la valeur actuelle de c2 est trouvé dans c1 on continue
    // Si la valeur actuelle de c2 n'est pas dans c1 je retourne 0
    // On fini de boucler tant qu on arrive a trouver c2 dans c1
    // Si tout c1 a ete trouvé dans c2 on retourne 1

    Vous direz de ma part à votre prof que c'est pas en apprenant à faire des conneries qu'on devient un bon développeur. Et si votre prof n'y est pour rien et que c'est la solution que vous préconisez, vous allez avoir une sale note à votre TP

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    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
    create or replace function f as
      l_num_emplacement t1.num_emplacement%type;
    begin
      select num_emplacement into l_num_emplacement
        from (
      SELECT t1.num_emplacement
        FROM t1
       WHERE t1.date_fin > sysdate
       minus
      SELECT t2.num_emplacement
        FROM t2, t3
       WHERE t2.num_emplacement = t3.code_emplacement
         AND t3.type_emplacement = variable1
             )
       where rownum = 1;
      return 0;
    exception when no_data_found then
      return 1;
    end;
    On ne fait pas un TO_DATE sur une date
    [edit] en fait c'est pas trunc(sysdate) que tu voulais, mais juste sysdate.

  8. #8
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par keegzer Voir le message
    En gros j'aimerai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    OPEN c1 FOR
       SELECT XXXX
    CLOSE c1;
     
    OPEN c2 FOR
       SELECT XXXX
    CLOSE c2;
     
    // Bouclage sur c2
       // Bouclage sur c1
    // SI la valeur actuelle de c2 est trouvé dans c1 on continue
    // Si la valeur actuelle de c2 n'est pas dans c1 je retourne 0
    // On fini de boucler tant qu on arrive a trouver c2 dans c1
    // Si tout c1 a ete trouvé dans c2 on retourne 1
    Les requêtes avec le minus correspond à votre besoin pas besoin de faire des boucles.

    P.S : les jointures ne s'écrivent plus de cette manière, si vous le pouvez utiliser plutôt le JOIN.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Les requêtes avec me minus correspond à votre besoin pas besoin de faire des boucles.

    P.S : les jointures ne s'écrivent plus de cette manière, si vous le pouvez utiliser plutôt le JOIN.
    Merci beaucoup à vous tous, je vais regarder du coté de MINUS.

    PS : Le WHERE et le JOIN ont exactement le même plan d'execution

  10. #10
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Citation Envoyé par keegzer Voir le message
    PS : Le WHERE et le JOIN ont exactement le même plan d'execution
    Peut-être mais le WHERE n'est pas une vrai jointure mais un produit cartésien. Et il est mieux de s'habituer à écrire selon la norme.

  11. #11
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    J'aurais plutôt tendance à faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 1-count(*)
      INTO l_result
      FROM t1
     WHERE t1.date_fin > sysdate
         AND NOT EXISTS (SELECT 1 
                           FROM t2
                               INNER JOIN t3 ON t2.num_emplacement = t3.code_emplacement
                         WHERE t3.type_emplacement = variable1
                            AND t2.num_emplacement  = t1.num_emplacement 
                             )
         AND rownum = 1
    Le NOT EXISTS me semble plus parlant que le minus, et éviter une exception systématique me semble mieux.

  12. #12
    Membre Expert

    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
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Peut-être mais le WHERE n'est pas une vrai jointure mais un produit cartésien. Et il est mieux de s'habituer à écrire selon la norme.
    Juste pour que vous soyez au courant. Ecrivez vos jointures en AINSI JOIN et tracez les avec l'event 10053. Vous seriez surprise de voir que le CBO transformera les ANSI JOIN en Oracle JOIN.

    Donc, conseillez l'utilisation des ANSI JOIN n'est pas mal en soit mais n'en faites pas une fixation.

    D'ailleurs, pour votre gouverne, il y a plusieurs "bugs" liés à l'utilisation des AINSI JOIN.

Discussions similaires

  1. Requête analyse croisée sous SQL SERVER
    Par motus_z dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2006, 16h54
  2. Requêtes analyses croisées sous SQL Server 2000
    Par callo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/09/2005, 19h27
  3. Pb Requête Corrélées sur MS SQL-SERVER2000
    Par Pongo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/09/2005, 16h08
  4. État, Requète et clause Where(SQL)
    Par Philippe299 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2005, 00h22
  5. Performance d'un traitement PL/SQL
    Par boxsters dans le forum PL/SQL
    Réponses: 17
    Dernier message: 25/07/2005, 08h10

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