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 :

Vérifier si une colonne existe dans une table


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Vérifier si une colonne existe dans une table
    Bonjour,

    Je dois effectuer une procédure qui regarde si la colonne existe dans la table.
    - si oui : il ne fait rien.
    - si non : il lance un script qui ajoute la colonne à la table (ALTER ...).

    Et je dois lancer cette procédure sous SQLPlus.

    J'ai tenter de créer, mais il ne fonctionne pas correctement quand je passe sous sqlplus.

    En espérant que vous puissiez m'aider.

    Merci d'avance.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Montrez-nous ce que vous avez essayé.

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Vous pouvez essayer quelque chose comme ceci :

    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
    DECLARE
    	v_count   NUMBER;
    BEGIN
    	SELECT	 COUNT ( * )
    	  INTO	 v_count
    	  FROM	 user_tab_columns
    	 WHERE	 table_name = 'MATABLE' AND column_name = 'MACOLONNE';
     
    	IF v_count = 0
    	THEN
    		ALTER TABLE...;
    	ELSE
    		DBMS_OUTPUT.put_line ('Colonne existe déja');
    	END IF;
    END;

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par Proxy Voir le message
    Vous pouvez essayer quelque chose comme ceci :

    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
    DECLARE
    	v_count   NUMBER;
    BEGIN
    	SELECT	 COUNT ( * )
    	  INTO	 v_count
    	  FROM	 user_tab_columns
    	 WHERE	 table_name = 'MATABLE' AND column_name = 'MACOLONNE';
     
    	IF v_count = 0
    	THEN
    		ALTER TABLE...;
    	ELSE
    		DBMS_OUTPUT.put_line ('Colonne existe déja');
    	END IF;
    END;
    C'est bon, à un (gros) détail près : l'ordre ALTER TABLE, à l'instar de tous les ordres DDL, n'est pas utilisable tel quel en PL/SQL. Il faut l'appeler en utilisant le SQL dynamique. Pour cela, la manière la plus simple est d'utiliser l'instruction EXECUTE IMMEDIATE suivi d'une chaîne de caractère qui contient l'ordre à exécuter.

    La procédure demandée peut donc s'écrire ainsi :

    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
     
    CREATE OR REPLACE PROCEDURE PR_ADD_COL(v_table_name in varchar2, v_col_name in varchar2, v_type in varchar2, v_type_size in number default null)
    IS
       v_count   NUMBER;
       v_order   varchar2(255);
    BEGIN
       SELECT	 COUNT ( * )
       INTO	 v_count
       FROM	 user_tab_columns
       WHERE	 table_name = upper(v_table_name) AND column_name = upper(v_col_name);
     
      IF v_count = 0 THEN
          v_order := 'ALTER TABLE ' || v_table_name || ' ADD ' || v_col_name || ' ' || v_type;
          IF v_type_size is not null then
              v_order := v_order || '(' || v_type_size || ')';
          END IF;
          DBMS_OUTPUT.put_line ('Exécution :' || v_order);
          EXECUTE IMMEDIATE v_order;
      ELSE
          DBMS_OUTPUT.put_line ('Colonne existe déja');
      END IF;
    END;
    /
     
    execute pr_add_col('MA_TABLE', 'MA_COLONNE', 'char', 1);

  5. #5
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE	 table_name = upper(v_table_name) AND column_name = upper(v_col_name);
    Votre procédure ne prend pas en charge d'éventuelles tables ou colonnes créées avec leur nom entre guillemets (conservation de la casse, des espaces, etc.).

    Je ne recommande pas cette pratique mais il faut garder cette particularité en tête.

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Pour ce qui est de ne pas conseiller cette pratique, vous prêchez un converti. Chez moi, c'est en contravention avec les règles de nommage.

    Mais c'est effectivement une piste d'amélioration pour tamise; à voir s'il doit traiter ce cas de figure. Et ce n'est pas la seule possibilité d'amélioration : si je devais critiquer le code que j'ai fourni, c'est le fait qu'on ne teste pas que la table à modifier existe bien qui me titille le plus...

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2015, 11h46
  2. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  3. Savoir si une colonne existe dans une table
    Par Deciprog dans le forum SAS Base
    Réponses: 4
    Dernier message: 26/02/2010, 19h46
  4. Réponses: 2
    Dernier message: 08/11/2007, 10h54
  5. Réponses: 2
    Dernier message: 08/11/2007, 10h54

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