DBMS_METADATA

DIRECT BY EYGLE.
從ORACLE9I開始Oracle提供了一個新的系統包DBMS_METADATA,可以用於提取對象創建的DDL語句。

這個Package功能極其強大,我們來看看它的使用方法.

1.獲得表的創建語句.

SQL> desc dbms_metadata
FUNCTION ADD_TRANSFORM RETURNS NUMBER
...
FUNCTION GET_DDL RETURNS CLOB
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OBJECT_TYPE                    VARCHAR2                IN
 NAME                           VARCHAR2                IN
 SCHEMA                         VARCHAR2                IN     DEFAULT
 VERSION                        VARCHAR2                IN     DEFAULT
 MODEL                          VARCHAR2                IN     DEFAULT
 TRANSFORM                      VARCHAR2                IN     DEFAULT
....

SQL> set long 2000
SQL> select dbms_metadata.get_ddl('TABLE','TEST') from dual;

DBMS_METADATA.GET_DDL('TABLE','TEST')
--------------------------------------------------------------------------------

  CREATE TABLE "SYS"."TEST"
   (    "OWNER" VARCHAR2(30),
        "OBJECT_NAME" VARCHAR2(128),
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(18),
        "CREATED" DATE,
        "LAST_DDL_TIME" DATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1)
   ) 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 "SYSTEM"

SQL>


2.進一步的,可以通過dbms_metadata獲得更全面的DDL語句

Oracle提供一個全面的範例:
$ORACLE_HOME/rdbms/demo/mddemo.sql
包括索引、授權、觸發器等所有DDL語句都可以被提取。

SQL> CREATE USER A IDENTIFIED BY A;

用戶已創建

SQL> select dbms_metadata.get_ddl('USER','A') from dual;

DBMS_METADATA.GET_DDL('USER','A')
------------------------------------------------------------------


   CREATE USER "A" IDENTIFIED BY VALUES 'AFCC9478DFBF9029'
      TEMPORARY TABLESPACE "TEMP"


有興趣的可以參考該文件,按照Demo的例子進行測試。


SQL> select dbms_metadata.get_ddl('TABLE','IUFO.IUFO_USERINFO') FROM DUAL;
ERROR:
ORA-31603: object "IUFO.IUFO_USERINFO" of type TABLE not found in schema "SYS"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA_INT", line 2917
ORA-06512: at "SYS.DBMS_METADATA_INT", line 3302
ORA-06512: at "SYS.DBMS_METADATA_INT", line 4189
ORA-06512: at "SYS.DBMS_METADATA", line 326
ORA-06512: at "SYS.DBMS_METADATA", line 410
ORA-06512: at "SYS.DBMS_METADATA", line 449
ORA-06512: at "SYS.DBMS_METADATA", line 615
ORA-06512: at "SYS.DBMS_METADATA", line 1221
ORA-06512: at line 1

no rows selected

SQL> CONN IUFO/UFSOFT4460895
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.
SQL> CONN IUFO/ufsoft2157923
SP2-0734: unknown command beginning "CONN..." - rest of line ignored.
SQL> CONNECT IUFO/ufsoft2157923
Connected.
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FROM DUAL;
SQL> SELECT DBMS_METADATA.GET_DDL('TA." - rest of line ignored. DUAL;
SQL> 734: unknown command beginning "
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE',
--------------------------------------------------------------------------------

  CREATE TABLE "IUFO"."IUFO_USERINFO"
   (    "USER_ID" VARCHAR2(20) NOT NULL ENA


SQL> COL DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FROMAT A100;
SP2-0158: unknown COLUMN option "FROMAT"
SQL> COLUMN DBMS_METADATA.GET_DDL FORMAT A100;
SQL> COL DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FORMAT A100;
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE',
--------------------------------------------------------------------------------

  CREATE TABLE "IUFO"."IUFO_USERINFO"
   (    "USER_ID" VARCHAR2(20) NOT NULL ENA


SQL> SET LONG 3000
SQL> SET PAGESIZE 100
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE',
--------------------------------------------------------------------------------

  CREATE TABLE "IUFO"."IUFO_USERINFO"
   (    "USER_ID" VARCHAR2(20) NOT NULL ENABLE,
        "USER_CODE" VARCHAR2(64) NOT NULL ENABLE,
        "USER_NAME" VARCHAR2(64) NOT NULL ENABLE,
        "PASSWORD" VARCHAR2(128),
        "ROLE" NUMBER(4,0),
        "UNIT_ID" VARCHAR2(64),
        "EMAIL" VARCHAR2(128),
         CONSTRAINT "PK_IUFO_USERINFO" PRIMARY KEY ("USER_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "IUFO"  ENABLE,
         CONSTRAINT "FK_USER_INFO" FOREIGN KEY ("UNIT_ID")
          REFERENCES "IUFO"."IUFO_UNIT_INFO" ("UNIT_ID") ENABLE
   ) 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 "IUFO"

SQL> CONNECT /AS SYSDBA
Connected.
SQL> SHOW USER
USER is "SYS"
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','IUFO_USERINFO','IUFO') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE',
--------------------------------------------------------------------------------

  CREATE TABLE "IUFO"."IUFO_USERINFO"
   (    "USER_ID" VARCHAR2(20) NOT NULL ENABLE,
        "USER_CODE" VARCHAR2(64) NOT NULL ENABLE,
        "USER_NAME" VARCHAR2(64) NOT NULL ENABLE,
        "PASSWORD" VARCHAR2(128),
        "ROLE" NUMBER(4,0),
        "UNIT_ID" VARCHAR2(64),
        "EMAIL" VARCHAR2(128),
         CONSTRAINT "PK_IUFO_USERINFO" PRIMARY KEY ("USER_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "IUFO"  ENABLE,
         CONSTRAINT "FK_USER_INFO" FOREIGN KEY ("UNIT_ID")
          REFERENCES "IUFO"."IUFO_UNIT_INFO" ("UNIT_ID") ENABLE
   ) 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 "IUFO"

SQL>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章