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 :

ALTER TABLE ajouter une colonne s'elle n'existe pas


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Points : 99
    Points
    99
    Par défaut ALTER TABLE ajouter une colonne s'elle n'existe pas
    Bonjour à tous,

    Je voudrai faire une requête qui ajoute un nouvelle colonne si cette dernière n'existe pas dans la table si elle existe et pas ajouter.
    Voici le code que j'ai fait :
    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
     
    DECLARE
        p_count  NUMBER;
    BEGIN 
        SELECT count(*) INTO p_count
        FROM user_tab_columns
        AND table_name = 'Table1'
        AND column_name = 'col1';
     
        IF IS_OBJECT = 0
        THEN
            BEGIN
                DBMS_OUTPUT.PUT_LINE('Ajouter la colonne col1');
                EXECUTE IMMEDIATE 'ALTER TABLE Table1 ADD (col1)';
     
    		ELSE 
    		DBMS_OUTPUT.PUT_LINE('La colonne est déjà existée');
            END;
    END IF;
    END;
    Le code de la condition d'ajouter si la colonne n'existe pas est-il bon?
    Pour plus de précision, la langue de sql est pl/sql.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Non il faut typer la colonne, c'est obligatoire.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Plusieurs soucis dans ton code.

    - Tu spécifies le nom de la table et de la colonne en mélange majuscules/minuscules, mais il faut le faire en majuscule (sauf si elles ont été créées avec des guillemets, ce qui n'est pas souhaitable)
    - Tu utilises la variable p_count pour vérifier si la colonne est présente mais ensuite tu utilises IS_OBJECT?
    - Le bloc BEGIN END interne est mal placé, il est d'ailleurs inutile ici
    - Il faut préciser un type de données pour la colonne
    - "La colonne est déjà existée" n'est pas correct, ce serait plutôt "La colonne existe déjà"

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Il manque la clause WHERE dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        SELECT count(*) INTO p_count
        FROM user_tab_columns
        AND table_name = 'Table1'
        AND column_name = 'col1';
    C'est quoi IS_OBJECT? Il est renseigné où?

    Je ne sais pas quel est ton métier mais quand je lis "la langue de sql est pl/sql" désolé mais ça ne veut rien dire; ton code est écrit en SQL, en PL/SQL, en Java, en C mais "la langue de sql" ne veut rie dire.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre régulier Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Bonjour,
    Je vous remercie de vos réponses.

    @Waldar : typer la colonne, cela signifie la propriété de la colonne?

    @Ikebukuro : effectivement, j'ai mal placé pour écrire "la langue de sql", c'est plutôt la langue de programmation. ^^

    @vanagreg : Pour le nom de table ne majuscule/minuscule, j'ai vu sur des sites qui indiquent un nom de table en majuscule et minuscule.
    IS_OBJECT est un variable que je me suis trompée de nommer comme j'ai déjà nommer p_count.
    J'ai enlevé BEGIN et END inutiles.
    J'ai défini le type de colonne.

    Voici le code corrigée :

    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
     
    DECLARE
        p_count  NUMBER;
     
        SELECT count(*) INTO p_count
        FROM user_tab_columns
        AND TABLE_NAME = 'TABLE1'
        AND COLUMN_NAME= 'col1';
     
        IF p_count  = 0
        THEN
            BEGIN
                DBMS_OUTPUT.PUT_LINE('Ajouter la colonne col1');
                EXECUTE IMMEDIATE 'ALTER TABLE TABLE1 ADD (col1 NUMBER(12,2))';
     
    		ELSE 
    		DBMS_OUTPUT.PUT_LINE('La colonne existe déjà');
            END;
    END IF;

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Il manque encore la clause WHERE.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  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
    Attention avec tes DECLARE, BEGIN, END

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE 
     définitions de variables
    BEGIN
    code 
    END;
    Ne pas confondre avec les tests de conditions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF .. THEN ..
    ELSIF .. THEN  ..
    ELSE ..
    END IF;
    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 chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Oui c'était du bloc BEGIN..END interne que je parlais...

  9. #9
    Membre régulier Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Merci à tous pour vos réponses,
    J'ai corrigé le code mais lors de test, il n'y a pas la fin de processus dès que le traitement termine, c'est à dire que j'ai lancé le test et ce dernier qui est toujours en cours même s'il n'y a pas d'erreur à afficher...

    Voici le code modifié :

    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
    DECLARE
        p_count  NUMBER;
     
        SELECT count(*) INTO p_count
        FROM user_tab_columns
        WHERE TABLE_NAME = 'TABLE1'
        AND COLUMN_NAME= 'col1';
     
        IF p_count  = 0
        THEN
            BEGIN
                DBMS_OUTPUT.PUT_LINE('Ajouter la colonne col1');
                EXECUTE IMMEDIATE 'ALTER TABLE TABLE1 ADD (col1 NUMBER(12,2))';
     
    		ELSE 
    		DBMS_OUTPUT.PUT_LINE('La colonne existe déjà');
            END;
       END IF;

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Presque, mais vos BEGIN END au milieu n'ont toujours aucun sens ; de surcroît vous ne pouvez pas l'imbriquer en plein milieu d'un IF THEN ELSE.

  11. #11
    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
    2 choses :
    1/ il y a incohérence entre le test de colonne et l'ordre de création de la colonne
    AND COLUMN_NAME= 'col1'; <= Colonne créée en forçant la minuscule
    ALTER TABLE TABLE1 ADD col1 NUMBER(12,2) <= Création de colonne en casse par défaut => en majuscule

    Si la colonne existante est en majuscule, tester column_name = 'COL1'
    Si le colonne existante est en minuscule, créer en forçant la minuscule : ADD "col1" NUMBER(12,2)

    2/ On peut aussi le faire sans les tests en gérant l'exception
    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  NUMBER;
     BEGIN
        SELECT 1 INTO v
        FROM user_tab_columns
        WHERE TABLE_NAME = 'TABLE1'
        AND COLUMN_NAME= 'col1';
     
    	DBMS_OUTPUT.PUT_LINE('Ajouter la colonne col1');
    	EXECUTE IMMEDIATE 'ALTER TABLE TABLE1 ADD col1 NUMBER(12,2)';
     
    EXCEPTION WHEN NO_DATA_FOUND
    THEN
    	DBMS_OUTPUT.PUT_LINE('La colonne existe déjà');
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre régulier Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    @McM et @Waldar : merci de vos réponses, c'est noté. J'ai modifié et testé, c'est impeccable. Je ferme ce sujet et merci encore d'avoir pris le temps de répondre à ce sujet.

    Voici mon code corrigé qui pourrait aider des autres :

    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
     
    DECLARE
        p_count  NUMBER;
     
    BEGIN 
        SELECT count(*) INTO p_count
        FROM ALL_TAB_COLUMNS
        WHERE TABLE_NAME = 'TABLE1'
        AND COLUMN_NAME= 'COL1';
     
        IF (p_count  = 0) THEN
                DBMS_OUTPUT.PUT_LINE('Ajouter la colonne col1');
                EXECUTE IMMEDIATE 'ALTER TABLE TABLE1 ADD (COL1 NUMBER(12,2))';
     
    	ELSE 
    		DBMS_OUTPUT.PUT_LINE('La colonne existe déjà');
         END IF;
    END;

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

Discussions similaires

  1. [XL-2010] Code VBA pour ajout d'une date lorsqu'elle n'existe pas
    Par Jey14 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/10/2013, 13h39
  2. Ajouter une div si elle n'existe pas
    Par beegees dans le forum jQuery
    Réponses: 6
    Dernier message: 15/06/2011, 09h23
  3. [XL-2010] Ajouter une feuille si elle n'existe pas
    Par PhaleneCAD dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/02/2011, 20h53
  4. Ajouter une ligne si elle n'existe pas dans la table
    Par daimadoshi dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/11/2010, 15h52
  5. Créer une procedure si elle n'existe pas.
    Par Chouls dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/01/2007, 10h49

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