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

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    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 du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394

  4. #4
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    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 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 394
    Points
    18 394
    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 du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    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, 15h48
  2. Réponses: 2
    Dernier message: 24/10/2012, 14h42
  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, 10h32
  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, 23h10
  5. Réponses: 4
    Dernier message: 06/03/2007, 13h00

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