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 :

PL SQL valeur booléenne select


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut PL SQL valeur booléenne select
    Bonjour,

    je suis sur une fonction qui doit l'existence d'un vakeur dans une autre
    table ...

    exemple :
    function verifSTATUT(statut in varchar) return boolean
    IS
    test boolean;
    BEGIN
    test := true;

    test := select 1 from A where A.code IN ( select code from TABCODE);
    Est ce possible , est judicieux ???
    meilleur idéee ???


    END verifSTATUT;


    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  2. #2
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 107
    Points : 126
    Points
    126
    Par défaut
    Juste une remarque pour l'optimisation : utiliser Exists au lieu de IN

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Merci de penser à utiliser les balises code (# dans la toolbar).

    Tout d'abord as-tu essayé la méthode que tu proposes ? Si c'est le cas tu as ta réponse tes 2 premières questions.

    Personnellement, je traiterais le problème en gérant une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function verifSTATUT(statut in varchar) 
    return boolean IS 
    BEGIN
      select 1
      from A
      where exists (select null from TABCODE where code = A.CODE)
       and rownum = 1;
      return true;
    EXCEPTION
       WHEN NO_DATA_FOUND THEN
          return false;
    END verifSTATUT;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut
    Sinon tu peux utiliser un curseur qui va chercher la valeur dans la table et qui avec la méta donnée FOUND te renvoie faux s'il ne la trouve pas.
    IL semble que ce soit une solution assez rapide

    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
     
    function verifSTATUT
    return boolean IS 
     
    CURSOR cursor IS
       SELECT *
       FROM MA_TABLE m,
               TAB_CODE c,
       WHERE m.code = c.code;
     
    line cursor%rowtype;
     
    value BOOLEAN;
     
    BEGIN
     
    open cursor;
     
    fetch cursor into line;
     
    value:=cursor%found;
     
    close cursor;
     
    return value;
     
    END;

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Le NOT EXISTS n'est vraiment pas utile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 1
    FROM A, TABCODE t
    WHERE t.code = a.code
    AND ROWNUM = 1
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par McM Voir le message
    Le NOT EXISTS n'est vraiment pas utile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 1
    FROM A, TABCODE t
    WHERE t.code = a.code
    AND ROWNUM = 1
    A mon avis sur ce type de requête, le exists est plus performant.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je suis pas sur : Comment choisir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select 1
      from A
      where exists (select null from TABCODE where code = A.CODE)
       and rownum = 1;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select 1
      from TABCODE 
      where exists (select null from A where code = TABCODE .CODE)
       and rownum = 1;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    A priori, je mettrai la table qui a le moins de données en requête principale et celle qui en a le plus dans la clause exists.

    Après rien ne vaut un explain plan.

    Un petit test pour illustrer mes propos :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    SQL> select count (*) from user_tables;
     COUNT(*)
    ---------
          534
     
    SQL> select count(*) from all_tables;
     COUNT(*)
    ---------
         1820
     
    SQL> set timing on
     
    SQL> declare
      2    v_test number(1);
      3  begin
      4    for v_table in 1..25 loop  
      5        begin
      6          select 1
      7          into v_test
      8          from user_tables u, all_tables a
      9          where u.table_name = a.table_name
     10            and rownum = 1;
     11         exception when no_data_found then null;
     12         end;
     13     end loop;
     14  end;
     15  /
    PL/SQL procedure successfully completed.
     real: 2157
     
    SQL> declare
      2    v_test number(1);
      3  begin
      4    for v_table in 1..25 loop  
      5        begin
      6          select 1
      7          into v_test
      8          from user_tables
      9          where exists (select null from all_tables where table_name = user_tables.table_name)
     10            and rownum = 1;
     11         exception when no_data_found then null;
     12         end;
     13     end loop;
     14  end;
     15  /
    PL/SQL procedure successfully completed.
     real: 63
     
    SQL> declare
      2    v_test number(1);
      3  begin
      4    for v_table in 1..25 loop  
      5        begin
      6          select 1
      7          into v_test
      8          from all_tables
      9          where exists (select null from user_tables where table_name = all_tables.table_name)
     10            and rownum = 1;
     11         exception when no_data_found then null;
     12         end;
     13     end loop;
     14  end;
     15  /
    PL/SQL procedure successfully completed.
     real: 2375
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut bonjour
    J'adore la réponse avec l'exception, cela m'ouvre de nouveau horizons.

    Et merci encore.

    Cordialement olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  10. #10
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Remarque post
    J'avais mal lu,
    Mais le dernier post est très intéressant ...


    olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

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

Discussions similaires

  1. Requete SQL : Valeur par defaut dans un SELECT
    Par Wiwi31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/06/2012, 22h44
  2. Réponses: 2
    Dernier message: 29/06/2011, 09h51
  3. [MySQL] Affichage de valeurs par selection dans une table
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/12/2005, 17h04
  4. [Oracle9i/ Pl/Sql] Update et select en même temps
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 7
    Dernier message: 31/05/2005, 17h26
  5. resultat requete SQL d'un select dans variable vb
    Par seb_06 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 11/10/2004, 16h29

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