web-dev-qa-db-ja.com

PL / SQLの既存の表に追加する前に列が存在するかどうかを確認する方法は?

Oracle dbのテーブルに列を追加する前に簡単なチェックを追加するにはどうすればよいですか?列の追加に使用しているSQLを含めました。

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

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」が既に存在するというエラーがログに表示されるため、大丈夫です。

85

または、エラーを無視できます:

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

通常、このような何かのために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びします。うまくいかない場合はお知らせください。この投稿を削除します。

10
billinkc