LoginSignup
0
0

More than 5 years have passed since last update.

Oracleでテーブル間で同一カラム名のコピーを行う

Last updated at Posted at 2015-11-16

データコンバートや、テストの場面で2テーブル間で同一カラム名をコピーする際に
カラム構成がほぼ同じ(だが少し異なる)場合、全カラム明記の憂き目に合います。

そんな作業を少しでも軽減すべく、Stored Procedureを書いてみました。
”EXECUTE IMMEDIATE”コマンドを使用するのでパフォーマンスが必要な場所には使えませんが
メンテナンス作業には使えるかと思います。

組み込みSQLで出来る方法があれば教えてください。
私が知らないだけかもしれません。

使用法

PL/SQL
BEGIN 
  -- TABLE1からTABLE2へ同一カラム名のものは全てコピー
  COPY_TABLE_COLS( 'TABLE1', 'TABLE2' );
  -- 上記のWHERE節付き
  COPY_TABLE_COLS( 'TABLE1', 'TABLE2', 'RECNO < 300' );
END;
/

Stored Procedure

PL/SQL
CREATE OR REPLACE PROCEDURE COPY_TABLE_COLS( SP_SOURCE_TABLE VARCHAR2, SP_TARGET_TABLE VARCHAR2, SP_SOURCE_WHERE VARCHAR2 := NULL)
IS
 vColNames VARCHAR2(3000);
 vSQL      VARCHAR2(3000); -- 項目が多すぎる場合は、問題が起きます。 悪しからず。
 vWHERE    VARCHAR2(3000);
BEGIN
    IF SP_SOURCE_WHERE IS NULL THEN
        vWHERE := '1=1';
    ELSE
        vWHERE := SP_SOURCE_WHERE;
    END IF;

    SELECT WMSYS.WM_CONCAT(Column_Name) INTO vColNames FROM (
      SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=SP_SOURCE_TABLE
      INTERSECT
      SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME=SP_TARGET_TABLE)
    WHERE Column_NAME NOT IN ('ROWID');

    vSQL := 'INSERT INTO ' || SP_TARGET_TABLE
        || '   ( ' || vColNames || ')'
        || ' SELECT ' || vColNames || ' FROM ' || SP_SOURCE_TABLE
        || ' WHERE ' || vWHERE;

    -- DBMS_OUTPUT.PUT_LINE(' SQL=' || vSQL);
    EXECUTE IMMEDIATE vSQL;
END;
/
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0