Oracle Databaseでテーブルをデータごとコピーする方法を紹介します。
SQL*Plus
CREATE TABLE ~ AS SELECT
を利用します。
CREATE TABLE EMPLOYEES_COPIED AS SELECT * FROM EMPLOYEES
この方法はインデックスや制約、コメントなどはコピーされないことに注意しましょう。
SQLDeveloper
対象のテーブルを右クリック > 表(C) > コピー(B)を選択する。
必要な値を入力し、「適用(A)」を押下します。
この方法はデータだけでなく、制約やインデックス、コメントもコピー可能です。
PL/SQL
すべてのテーブルにタイムスタンプをつけて、コピーするプロシージャです。開発中・検証中によく使うのでおまけとして紹介します。
SET SERVEROUTPUT ON;
DECLARE
yyyymmdd VARCHAR2(1000);
stmt VARCHAR2(1000);
BEGIN
yyyymmdd := TO_CHAR(SYSDATE, 'YYYYMMDD');
FOR cur IN (SELECT * FROM USER_TABLES) LOOP
stmt := 'CREATE TABLE ' || cur.TABLE_NAME || '_' || yyyymmdd || ' AS SELECT * FROM ' || cur.TABLE_NAME;
DBMS_OUTPUT.PUT_LINE('EXECUTE => ' || stmt);
EXECUTE IMMEDIATE stmt;
END LOOP;
END;
/
コピー対象を絞りたい場合は、SELECT * FROM USER_TABLES
に適切なWHERE節を追加してください。
利用例
以下のとおりにテーブルがあるとします。
この状態で、上記のプロシージャを実行すると、以下のようなログがコンソールに表示されます。
EXECUTE => CREATE TABLE REGIONS_20240525 AS SELECT * FROM REGIONS
EXECUTE => CREATE TABLE COUNTRIES_20240525 AS SELECT * FROM COUNTRIES
EXECUTE => CREATE TABLE LOCATIONS_20240525 AS SELECT * FROM LOCATIONS
EXECUTE => CREATE TABLE DEPARTMENTS_20240525 AS SELECT * FROM DEPARTMENTS
EXECUTE => CREATE TABLE JOBS_20240525 AS SELECT * FROM JOBS
EXECUTE => CREATE TABLE EMPLOYEES_20240525 AS SELECT * FROM EMPLOYEES
EXECUTE => CREATE TABLE JOB_HISTORY_20240525 AS SELECT * FROM JOB_HISTORY
PL/SQLプロシージャが正常に完了しました。
実行結果は以下の通りです。
環境情報
SELECT * FROM v$version;
BANNER | BANNER_FULL | BANNER_LEGACY | CON_ID |
---|---|---|---|
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production | Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 |
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production | 0 |