web-dev-qa-db-de.com

Wie prüfe ich, ob eine Spalte vorhanden ist, bevor sie in PL/SQL zu einer vorhandenen Tabelle hinzufügt?

Wie füge ich vor dem Hinzufügen einer Spalte zu einer Tabelle für eine Oracle-Datenbank eine einfache Prüfung hinzu? Ich habe die SQL hinzugefügt, die ich zum Hinzufügen der Spalte verwende.

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

Auf alle Metadaten zu den Spalten in Oracle Database kann mit einer der folgenden Ansichten zugegriffen werden.

user_tab_cols ; - Für alle Tabellen, die dem Benutzer gehören

all_tab_cols ; - Für alle Tabellen, auf die der Benutzer zugreifen kann

dba_tab_cols ; - Für alle Tabellen in der Datenbank.

Wenn Sie also nach einer Spalte wie ADD_TMS in der SCOTT.EMP-Tabelle suchen und die Spalte nur hinzufügen, wenn sie nicht vorhanden ist, würde der PL/SQL-Code entlang dieser Zeilen stehen.

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

Wenn Sie planen, dies als Skript auszuführen (nicht Teil einer Prozedur), besteht der einfachste Weg darin, den Befehl alter in das Skript aufzunehmen und die Fehler am Ende des Skripts zu sehen, vorausgesetzt, Sie haben kein Begin-End für das Skript ..

Wenn Sie file1.sql haben

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

Col2 ist vorhanden, wenn das Skript ausgeführt wird, werden die anderen beiden Spalten der Tabelle hinzugefügt und das Protokoll zeigt die Fehlermeldung an, dass "col2" bereits vorhanden ist. Sie sollten also in Ordnung sein.

79

Oder Sie können den Fehler ignorieren:

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

Normalerweise würde ich vorschlagen, die ANSI-92-Standard-Metatabellen für so etwas auszuprobieren, aber ich sehe jetzt, dass Oracle es nicht unterstützt.

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

Stattdessen sieht es so aus , als müsste man so etwas tun

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

Ich entschuldige mich dafür, dass ich keine Oracle-Instanz habe, um das zu überprüfen. Wenn es nicht funktioniert, lass es mich wissen und ich werde diesen Beitrag löschen.

10
billinkc

Die Spalte ist vorhanden

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

Referenzlink

0
Java_Alert