GET_DDL学习笔记
DBMS_METADATA.GET_DDL。是oracle9i的一个新特性,用来获取对象的原数据(以ddl语句的形式保存,可以用来创建对象)。
先看一下我做的应用,然后逐句分析。
将以下语句保存到e:/get_ddl.txt
-- author: qinhaichun@hotmail.com
-- date: 2007.05.13
set termout off;
set heading off;
set feedback off;
set pagesize 0;
SET LONG 90000;
spool e:/table_ddl.txt;
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name) FROM user_tables;
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');
spool off;
set termout on;
set heading on;
set feedback on;
运行语句:
SQL> connect scott/tiger
已连接。
SQL> @e:/get_ddl.txt
SQL>host type e:/table_ddl.txt
CREATE TABLE "SCOTT"."BONUS"
( "ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"SAL" NUMBER,
"COMM" NUMBER
) ;
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") ENABLE
) ;
......
这样就得到了table的定义,也可以修改语句用来生成索引,视图、过程、包的DDL语句。
下面解释一些重要的语句。
GET_DDL语法:
DBMS_METADATA.GET_DDL (
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
对象类型,和对象名称可以用select object_type, object_name from user_objects;来查看。
set termout off;
在spool生成的文件中,去掉命令显示。值得一提的是,这个命令必须放在文件里,然后执行文件才有效。直接SQL>set termout off;是无效的。
set heading off;
不显示字段的名称。
set feedback off;
不显示sql语句的结果。如:“已选择1行。”
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
不显示表的存储信息。
SEGMENT_ATTRIBUTE参数
If TRUE, emit segment attributes (physical attributes, storage attributes, tablespace, logging). Defaults to TRUE.
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
每个sql语句末尾追加结束符(; or /)
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');
恢复默认值。
如果想把一个用户的对象都导出来的话,上面做的还远远不够,需要研究一下SET_TRANSFORM_PARAM过程中的参数。
DBMS_METADATA.GET_DDL。是oracle9i的一个新特性,用来获取对象的原数据(以ddl语句的形式保存,可以用来创建对象)。
先看一下我做的应用,然后逐句分析。
将以下语句保存到e:/get_ddl.txt
-- author: qinhaichun@hotmail.com
-- date: 2007.05.13
set termout off;
set heading off;
set feedback off;
set pagesize 0;
SET LONG 90000;
spool e:/table_ddl.txt;
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name) FROM user_tables;
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');
spool off;
set termout on;
set heading on;
set feedback on;
运行语句:
SQL> connect scott/tiger
已连接。
SQL> @e:/get_ddl.txt
SQL>host type e:/table_ddl.txt
CREATE TABLE "SCOTT"."BONUS"
( "ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"SAL" NUMBER,
"COMM" NUMBER
) ;
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO") ENABLE
) ;
......
这样就得到了table的定义,也可以修改语句用来生成索引,视图、过程、包的DDL语句。
下面解释一些重要的语句。
GET_DDL语法:
DBMS_METADATA.GET_DDL (
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
对象类型,和对象名称可以用select object_type, object_name from user_objects;来查看。
set termout off;
在spool生成的文件中,去掉命令显示。值得一提的是,这个命令必须放在文件里,然后执行文件才有效。直接SQL>set termout off;是无效的。
set heading off;
不显示字段的名称。
set feedback off;
不显示sql语句的结果。如:“已选择1行。”
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
不显示表的存储信息。
SEGMENT_ATTRIBUTE参数
If TRUE, emit segment attributes (physical attributes, storage attributes, tablespace, logging). Defaults to TRUE.
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);
每个sql语句末尾追加结束符(; or /)
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'DEFAULT');
恢复默认值。
如果想把一个用户的对象都导出来的话,上面做的还远远不够,需要研究一下SET_TRANSFORM_PARAM过程中的参数。