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.