データコンバートや、テストの場面で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;
/