Comment vérifier si une colonne existe avant de l’append à une table existante dans PL / SQL?

Comment puis-je append une simple vérification avant d’append une colonne à une table pour une firebase database Oracle? J’ai inclus le code SQL que j’utilise pour append la colonne.

ALTER TABLE db.tablename ADD columnname NVARCHAR2(30); 

Toutes les métadonnées relatives aux colonnes d’Oracle Database sont accessibles à l’aide de l’une des vues suivantes.

user_tab_cols ; – Pour toutes les tables appartenant à l’utilisateur

all_tab_cols ; – Pour toutes les tables accessibles à l’utilisateur

dba_tab_cols ; – Pour toutes les tables de la firebase database.

Donc, si vous cherchez une colonne comme ADD_TMS dans la table SCOTT.EMP et ajoutez la colonne uniquement si elle n’existe pas, le code PL / SQL serait dans ce sens.

 DECLARE v_column_exists number := 0; BEGIN Select count(*) into v_column_exists from user_tab_cols where column_name = 'ADD_TMS' and table_name = 'EMP'; --and owner = 'SCOTT --*might be required if you are using all/dba views if (v_column_exists = 0) then execute immediate 'alter table emp add (ADD_TMS date)'; end if; end; / 

Si vous envisagez de l’exécuter en tant que script (ne faisant pas partie d’une procédure), le plus simple serait d’inclure la commande alter dans le script et de voir les erreurs à la fin du script, en supposant que vous n’avez pas de Begin-End pour le script..

Si vous avez fichier1.sql

 alter table t1 add col1 date; alter table t1 add col2 date; alter table t1 add col3 date; 

Et col2 est présent, lorsque le script est exécuté, les deux autres colonnes seraient ajoutées à la table et le journal afficherait l’erreur en disant que “col2” existe déjà, vous devriez donc être d’accord.

Ou, vous pouvez ignorer l’erreur:

 declare column_exists exception; pragma exception_init (column_exists , -01430); begin execute immediate 'ALTER TABLE db.tablename ADD columnname NVARCHAR2(30)'; exception when column_exists then null; end; / 

Normalement, je suggérerais d’essayer les méta-tables standard ANSI-92 pour quelque chose comme ça, mais je vois maintenant qu’Oracle ne le supporte pas.

 -- this works against most any other database SELECT * FROM INFORMATION_SCHEMA.COLUMNS C INNER JOIN INFORMATION_SCHEMA.TABLES T ON T.TABLE_NAME = C.TABLE_NAME WHERE C.COLUMN_NAME = 'columnname' AND T.TABLE_NAME = 'tablename' 

Au lieu de cela, il semble que vous deviez faire quelque chose comme

 -- Oracle specific table/column query SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'tablename' AND COLUMN_NAME = 'columnname' 

Je m’excuse car je n’ai pas d’instance Oracle pour vérifier ce qui précède. Si cela ne fonctionne pas, faites-le moi savoir et je supprimerai ce message.