OracleのDDLコマンドを自動生成できる

Oracle データベースでは、既存オブジェクト再作成用の SQL (DDL) を
作成するファンクションが提供されている。

実はコレ、用途によっては利用価値が高いので、目から鱗状態の人も少なくないはず。
作成するには、DBMS_METADATA.GET_DDL ファンクションを使用する。



既存オブジェクトの Create文が欲しいとき

テーブルやビューなどのオブジェクトから定義を出力する DBMS_METADATA.GET_DDL。
既存オブジェクト再作成 SQL を出力できるのは、とっても便利だ。

出力フォーマットは CLOB のため、set pages と set long の設定が必要。

SQL コマンド

select dbms_metadata.get_ddl('(1)','(2)','(3)') from dual;

(1) オブジェクト種類:TABLESPACE、TABLE、INDEX、VIEW、SYNONYM、PACKAGE、PROCEDURE など
(2) オブジェクト名:対象のオブジェクト名を指定
(3) スキーマ名:省略時は現在のスキーマとなる

例:SYSTEM 表領域の DDL 出力

SQL> set long 10000
SQL> select dbms_metadata.get_ddl('TABLESPACE','SYSTEM') from dual;

  CREATE TABLESPACE "SYSTEM" DATAFILE
  '/share/oradata/ORCL/system01.dbf' SIZE 1048576000
  AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS  SEGMENT SPACE MANAGEMENT MANUAL

例:HOGE スキーマの TEST テーブル定義出力

SQL> set long 10000
SQL> set pages 0
SQL> select dbms_metadata.get_ddl('TABLE','TEST','HOGE') from dual;

  CREATE TABLE "HOGE"."TEST"
   (    "COL1" NUMBER,
        "COL2" CHAR(10),
        "COL3" DATE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "TESTTBS"

このスクリプトを控えておけば、オブジェクトの再作成が容易になるので、
是非覚えておくべき Tips のひとつ。