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);
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.
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;
/
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.
Die Spalte ist vorhanden
select column_name as found
from user_tab_cols
where table_name = '__TABLE_NAME__'
and column_name = '__COLUMN_NAME__'