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

Oracle Discussion :

Vérifier l'existence simultanée de certains champs d'une table


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut Vérifier l'existence simultanée de certains champs d'une table
    Bonjour,

    je voudrais vérifier l´existence de certains champs d' une table avant de lancer sur celle-ci une procédure.

    Pour cela voilà mon code:

    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
     
     
    declare 
    v1 pls_integer := 0;
    v2 pls_integer := 0;
     
    v3 pls_integer := 0;
     
    begin 
     
    select 1, 1, 1 into v1, v2, v3 from user_tab_columns
    where table_name = 'MA_TABLE'
     
    and (column_name = 'COL1'
           or column_name = 'COL2'
           or column_name = 'COL3')
    having count(*) = 1;
     
     
    if v1 <> 0 then 
     
    dbms_output.put_line ('créez la col1 avant de continuer');
     
    elsif v2 <> 0 then 
     
    dbms_output.put_line ('créez la col2 avant de continuer');
     
    elsif v3 <> 0 then 
     
    dbms_output.put_line ('créez la col3 avant de continuer');
     
    end if;
     
    exeption 
     
    when no_data_found then
     
    dbms_output.put_line ('Il vous manquent des colonnes importantes');
     
    when too_many_rows then
     
    dbms_output.put_line ('beaucoup trop de valeurs retournées');
     
    end;
    Seulement malgré la présence des colonnes recherchées, le programme rentre dans le bloc exceptions et me dit que les colonnes sont inexistantes.

    Quelqu´un pourrait - il m´éclairer svp?

    merci

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut précision
    je présume que le problème se trouve au niveau de la clause Having.

    car lorsque je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Having count (*) > 0;
    le programme s' execute mais en ignorant totalement le bloc


  3. #3
    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

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut
    merci Waldar,

    grâce à ton lien j´ai modifié le code comme suit:

    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
     
     
    declare 
    v1 pls_integer := 0;
    v2 pls_integer := 0;
     
    v3 pls_integer := 0;
     
    begin 
     
    SELECT 1, 1, 1 INTO v1, v2, v3 FROM user_tab_columns
    WHERE table_name = 'MA_TABLE'
     
    AND column_name IN ('COL1', 'COL2', 'COL3')
    HAVING count(distinct column_name) = 3;
     
     
    IF v1 <> 0 then 
     
    dbms_output.put_line ('créez la col1 avant de continuer');
     
    elsif v2 <> 0 then 
     
    dbms_output.put_line ('créez la col2 avant de continuer');
     
    elsif v3 <> 0 then 
     
    dbms_output.put_line ('créez la col3 avant de continuer');
     
    end IF;
     
    exeption 
     
    when no_data_found then
     
    dbms_output.put_line ('Il vous manquent des colonnes importantes');
     
    when too_many_rows then
     
    dbms_output.put_line ('beaucoup trop de valeurs retournées');
     
    end;
    mais malheureusement tjrs la même erreur. Ou alors y aurait-il quelque chose qui m' a échappé?

  5. #5
    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
    Il faut voir que s'il manque une des trois colonnes de la table, la requête ne retournera pas de données et vous partirez systématiquement dans l'exception no_data_found, sans savoir quelle colonne est manquante.

    À priori ça ne colle pas à votre besoin.
    Partez sur cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT max(case column_name when 'COL1' then 0 else 1 end)
         , max(case column_name when 'COL2' then 0 else 1 end)
         , max(case column_name when 'COL3' then 0 else 1 end)
      INTO v1, v2, v3
      FROM user_tab_columns
     WHERE table_name = 'MA_TABLE'
       AND column_name IN ('COL1', 'COL2', 'COL3');
    Par contre vous avez un problème dans la logique de construction de votre bloc PL/SQL.
    Soit vous exploitez le résultat select into en parcourant les valeurs avec les if, soit vous exploitez l'exception (avec un c après le x) mais dans ce cas-là le reste du bloc est ignoré.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Par défaut MERCI
    Milles fois MERCI Waldar,

    sans ton aide je n' y serais jamais parvenue. C´est exactement ce que je cherchais.
    Par contre le select max case je ne connaissais pas.

    Merci encore!!!

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

Discussions similaires

  1. Importation de certains champs d'une table Access (Avec ADO)
    Par youness.el2010 dans le forum VBA Access
    Réponses: 3
    Dernier message: 26/02/2013, 14h48
  2. Réponses: 2
    Dernier message: 24/10/2012, 13h42
  3. Copie sélective de certains champs dans une table sous MS access
    Par dontdriveatruck dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/05/2009, 09h32
  4. Modifier les valeurs de certains champs d'une table
    Par Xorbane dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/10/2007, 22h10
  5. Réponses: 4
    Dernier message: 06/03/2007, 12h00

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