web-dev-qa-db-fra.com

Comment vérifier si une colonne existe avant de l'ajouter à une table existante en PL/SQL?

Comment ajouter une vérification simple avant d'ajouter une colonne à une table pour une base de données Oracle? J'ai inclus le code SQL que j'utilise pour ajouter la colonne.

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

Toutes les métadonnées sur les colonnes de la base de données Oracle 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 base de données.

Donc, si vous recherchez une colonne comme ADD_TMS dans la table SCOTT.EMP et ajoutez la colonne uniquement si elle n’existe pas, le code PL/SQL suivrait ces lignes.

DECLARE
  v_column_exists number := 0;  
BEGIN
  Select count(*) into v_column_exists
    from user_tab_cols
    where upper(column_name) = 'ADD_TMS'
      and upper(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 moyen le plus simple consiste à inclure la commande alter dans le script et à afficher les erreurs à la fin du script, en supposant que vous n'avez pas Begin-End pour. le scénario..

Si vous avez file1.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 sont ajoutées à la table et le journal indique l’erreur indiquant que "col2" existe déjà. Vous devriez donc vous en remettre.

79
Rajesh Chamarthi

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;
/
23
grokster

Normalement, je suggérerais d'essayer les méta-tables standard ANSI-92 pour quelque chose comme ceci, mais je vois maintenant que Oracle ne le prend pas en charge.

-- 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'

On dirait que vous devez 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 en ce que je n'ai pas d'instance Oracle pour vérifier ce qui précède. Si cela ne fonctionne pas, s'il vous plaît faites le moi savoir et je vais supprimer ce post.

8
billinkc

Pour vérifier que la colonne existe

select column_name as found
from user_tab_cols
where table_name = '__TABLE_NAME__'
and column_name = '__COLUMN_NAME__'

Lien de référence

0
Java_Alert