Oracle dbのテーブルに列を追加する前に簡単なチェックを追加するにはどうすればよいですか?列の追加に使用しているSQLを含めました。
ALTER TABLE db.tablename
ADD columnname NVARCHAR2(30);
Oracle Databaseの列に関するすべてのメタデータには、次のビューのいずれかを使用してアクセスできます。
ser_tab_cols ; -ユーザーが所有するすべてのテーブル
all_tab_cols ; -ユーザーがアクセスできるすべてのテーブル
dba_tab_cols ; -データベース内のすべてのテーブル。
したがって、SCOTT.EMP表でADD_TMSなどの列を探して、存在しない場合にのみ列を追加する場合、PL/SQLコードはこれらの行に沿って配置されます。
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;
/
これをスクリプト(手順の一部ではない)として実行することを計画している場合、最も簡単な方法は、スクリプトにalterコマンドを含めて、スクリプトの最後にエラーを表示することです。スクリプト..
File1.sqlがある場合
alter table t1 add col1 date;
alter table t1 add col2 date;
alter table t1 add col3 date;
また、col2が存在する場合、スクリプトを実行すると、他の2つの列がテーブルに追加され、「col2」が既に存在するというエラーがログに表示されるため、大丈夫です。
または、エラーを無視できます:
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;
/
通常、このような何かのためにANSI-92標準メタテーブルを試すことをお勧めしますが、Oracleはそれをサポートしていないことがわかりました。
-- 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'
代わりに、 looks のような何かをする必要があるように
-- Oracle specific table/column query
SELECT
*
FROM
ALL_TAB_COLUMNS
WHERE
TABLE_NAME = 'tablename'
AND COLUMN_NAME = 'columnname'
上記を確認するためのOracleインスタンスを持っていないことをおdoびします。うまくいかない場合はお知らせください。この投稿を削除します。