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 Firebird Discussion :

comment savoir si un champs existe dans une table


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut comment savoir si un champs existe dans une table
    Bonjour à tous,
    Actuellement je suis en train de mettre à jour une centaine de base de données en ajoutant des champs supplémentaires, j'utilise la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with REQETTE do
    begin
               try
                     sql.strings[0]:='alter TABLE1   add  STU smallinteger';
                     execsql;
              except
              end;
    mais je voudrais savoir si il ya un moyen de connaitre l'existence d'un champs on utilisant une commande sql.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 804
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Oui, il suffit d'utiliser les tables systèmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select rdb$field_name from rdb$relation_fields
    where rdb$relation_name=<nom table> AND rdb$fieldname=<nom colonne>;
    par contre la requête ALTER n'accepte pas de clause WHERE , ce qui fait que le try except ne me parait pas si mal et permet d'éviter la requête sur rdb$relation_fields maintenant, s'il s'agit de créer une procédure c'est une autre affaire !


    j'en profite aussi pour faire une critique sur le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     try
        sql.strings[0]:='alter TABLE1   add  STU smallinteger';
        execsql;
     except
     end;
    utiliser sql.Strings[0] me parait dangereux s'il n'y a qu'une seule ligne autant mettre SQL.Text:='alter TABLE1 add STU smallinteger';s'il y en a plusieurs, un bloc devrait contenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     try
        sql.Clear;
        sql.Add('alter TABLE1   add  STU smallinteger');
        sql.Add(''); ...... autres lignes
        execsql;
     except
     end;

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut
    bonjour,
    on peut donc mettre le code dans une procédure stockée et en fonction du résultat on procède ou non à la mise à jour

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 804
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    cela me semblait évident
    et en utilisant des EXECUTE STATEMENT pour remplacer le nom de table
    il est facilement possible d'avoir comme paramètre d'entrée de la procédure le nom de table

    mais cela en vaut-il vraiment la peine ? au mieux cette procédure ne sera utilisée que le nombre de fois qu'il y a des tables à modifier, la garder ensuite serait inutile
    l'autre solution utiliser en plus EXECUTE BLOCK
    Dans le principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    EXECUTE BLOCK(NOMTABLE VARCHAR(31) = ?,NOMCHAMP VARCHAR(31)= ?,TYPECHAMP VARCHAR(20)=?)
    AS
    DECLARE VARIABLE STMT VARCHAR(250);
    DECLARE VARIABLE EXISTE SMALLINT;
    BEGIN
    STMT='select 1 from rdb$relation_fields where rdb$relation_name="'||NOMTABLE||'" AND rdb$fieldname="'||NOMCHAMP||'"' ;
    EXECUTE STATEMENT STMT INTO :I;
    IF (i IS NOT NULL) THEN 
      BEGIN
        STMT='ALTER TABLE '||NOMTABLE||' ADD '||NOMCHAMP||' '||TYPECHAMP;
        EXECUTE STATEMENT STMT;
      END
    END
    maintenant avec Flamerobin outre le fait qu'il faille rajouter des SET TERM, ce dernier n'accepte pas l'entrée de paramètres (les '?' que l'on remplacerait avec Delphi par :NOMTABLE, :NOMCHAMP,:TYPECHAMP) j'ai tenté sans résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET TERM #;
    EXECUTE BLOCK(NOMTABLE VARCHAR(31) = 'TABLETEST',NOMCHAMP VARCHAR(31)='STU',TYPECHAMP VARCHAR(20)='SMALLINT')
    AS
    ...
    BEGIN
    ....
    END#
    SET TERM ; #
    c'est la première fois que j'essayais un entrée de paramètres avec flamerobin et j'obtiens un token unknown dès la ligne 2.
    il faudrait essayer avec ISQL à Artemus24
    Quant à une procédure , je laisse déduire le corps de celle-ci, le travail est mâché

    N.B. il me reste un petit doute sur le premier statement NOMTABLE et NOMCHAMP doivent être encadrés par des quotes mais sont-ce des simples (apostrophes) ou des doubles (guillemets)

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 347
    Par défaut
    Salut à tous.

    Je suis désolé si je viens perturber ce sujet, mais j'ai essayé de faire les tests.
    Je le simplifie au maximum et j'ai cette erreur :
    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
    execute block
    as
      declare i int = 0;
    Statement failed, SQLSTATE = 42000
    Dynamic SQL Error
    -SQL error code = -104
    -Unexpected end of command - line 3, column 19
    After line 0 in file Test.sql
    begin
    end;
    Statement failed, SQLSTATE = 42000
    Dynamic SQL Error
    -SQL error code = -104
    -Token unknown - line 1, column 1
    -begin
    At line 4 in file Test.sql
     
    quit;
    Il me semble que la syntaxe soit correcte mais comme je suis encore débutant avec FireBird, il se peut qu'un paramétrage soit nécessaire quelque part.

    Idem pour le 'try ... except ... end;'

    Comme l'indique SergioMaster, je suis en ligne de commande 'ISQL'. Dois-je comprendre que je ne suis pas dans le bon environnement ?

    @+

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 954
    Par défaut
    Bonjour,

    Je pense que utiliser le "try except end;" est la solution la plus optimale, j'aurais aimé qu'il y est un code comme ce ceci par exple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update table1  add champs1 integer where champs1 not exists
    je vai faire une proposition aux concepteur de firebird

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 804
    Billets dans le blog
    65
    Par défaut
    Bonsoir
    Citation Envoyé par chekkal Voir le message
    j'aurais aimé qu'il y est un code comme ce ceci par exple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update table1  add champs1 integer where champs1 not exists
    je vais faire une proposition aux concepteur de firebird
    Chiche

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

Discussions similaires

  1. [AC-2007] Savoir si un champ existe dans une table
    Par Guns Of The Patriots dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/03/2010, 11h30
  2. Réponses: 4
    Dernier message: 06/01/2010, 21h58
  3. Réponses: 2
    Dernier message: 06/05/2006, 23h50
  4. Réponses: 7
    Dernier message: 05/05/2006, 20h55
  5. Réponses: 2
    Dernier message: 04/05/2006, 12h34

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