正文:
工作上数据库搭建测试环境 只需要部分表进行测试 不要求环境完全一样,给出让导出一两张表的表结构在新库建立即可。
这里我用到 dbms_metadata.get_ddl 这个函数简单记录一下:
首先查询建表DDL语句,返回的是一个clob字段,给出的建表SQL:
select dbms_metadata.get_ddl('TABLE','DB_OPERATE_RECORD','ERUPT') from dual;
CREATE TABLE "ERUPT"."DB_OPERATE_RECORD"
( "OPERATE_ID" NUMBER(30,0) NOT NULL ENABLE,
"TABLE_NAME" VARCHAR2(200) NOT NULL ENABLE,
"ORIGINAL_DATA" CLOB,
"OPERATE_SCRIPT" CLOB,
"ROLLBACK_SCRIPT" CLOB,
"REMARKS" VARCHAR2(100),
"CREATE_TIME" DATE DEFAULT sysdate,
"SOURCE_ID" VARCHAR2(100),
"REQUEST_IP" VARCHAR2(100),
"ROLLBACK_FLAG" NUMBER DEFAULT 0,
"ROLLBACK_TIME" DATE DEFAULT null,
CONSTRAINT "DB_OPERATE_ID" PRIMARY KEY ("OPERATE_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "ERUPT" ENABLE
) SEGMENT CREATION IMMEDIATE
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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "ERUPT"
LOB ("ORIGINAL_DATA") STORE AS BASICFILE (
TABLESPACE "ERUPT" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("OPERATE_SCRIPT") STORE AS BASICFILE (
TABLESPACE "ERUPT" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("ROLLBACK_SCRIPT") STORE AS BASICFILE (
TABLESPACE "ERUPT" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
这里 我们发现给出的建表ddl语句没有字段注释,我们需要使用另一个函数来获取字段注释并comment,具体操作如下
SELECT DISTINCT DBMS_LOB.substr(DBMS_METADATA.get_dependent_ddl('COMMENT',
'DB_OPERATE_RECORD')) as table_comment
FROM (SELECT distinct table_name
FROM user_col_comments
WHERE comments IS NOT NULL);
执行此语句我们会得到字段COMMENT的执行语句,如下:
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."OPERATE_ID" IS '操作记录ID'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."TABLE_NAME" IS '表名称'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."ORIGINAL_DATA" IS '原始数据'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."OPERATE_SCRIPT" IS '操作脚本'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."ROLLBACK_SCRIPT" IS '数据还原脚本'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."REMARKS" IS '备注'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."CREATE_TIME" IS '创建时间'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."SOURCE_ID" IS '数据源ID'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."REQUEST_IP" IS '请求IP'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."ROLLBACK_FLAG" IS '回滚恢复标记'
COMMENT ON COLUMN "ERUPT"."DB_OPERATE_RECORD"."ROLLBACK_TIME" IS '回滚恢复时间'
直接在建表后执行语句即可还原原表字段注释了。
扩展:
dbms_metadata.get_ddl函数的语法:
SELECT DBMS_METADATA.GET_DDL(OBJECT_TYPE, NAME, SCHEMA) FROM DUAL
上述传入的参数含义如下:
参数 | 释义 |
OBJECT_TYPE | 对象的类型,如TABLE、INDEX、FUNTION等 |
NAME | 对象名,如表名,索引名,函数名等 |
SCHEMA | 对象所在schema,默认为当前用户所在schema |
VERSION | 可选参数,对象原数据的版本 |
MODEL | 可选参数,原数据的类型默认为Oracle |
TRANSFORM | 可选参数 |
该函数返回的是CLOB数据。
下面是函数定义(可以看到相关的参数):
-- GET_DDL: Return the metadata for a single object as DDL.
-- This interface is meant for casual browsing (e.g., from SQLPlus)
-- vs. the programmatic OPEN / FETCH / CLOSE interfaces above.
-- PARAMETERS:
-- object_type - The type of object to be retrieved.
-- name - Name of the object.
-- schema - Schema containing the object. Defaults to
-- the caller's schema.
-- version - The version of the objects' metadata.
-- model - The object model for the metadata.
-- transform - XSL-T transform to be applied.
-- RETURNS: Metadata for the object transformed to DDL as a CLOB.
FUNCTION 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;
下面给出一些其他的DDL查询方法:
--获得某个schema下所有的表、索引、视图、存储过程、函数的DDL
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name,u.owner) FROM DBA_TABLES u;
SELECT DBMS_METADATA.GET_DDL('VIEW',u.view_name,u.owner) FROM DBA_VIEWS u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name,u.owner) FROM DBA_INDEXES u;
SELECT DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name, u.owner,) FROM DBA_OBJECTS u WHERE u.object_type = 'PROCEDURE';
SELECT DBMS_METADATA.GET_DDL('FUNCTION',u.object_name, u.owner,) FROM DBA_OBJECTS u WHERE u.object_type = 'FUNCTION';
--获得某个表空间的DDL
SELECT DBMS_METADATA.GET_DDL('TABLESPACE','TABLES_NAME') FROM DUAL;
--获得所有表空间的DDL
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;
--获得单个用户的DDL
SELECT DBMS_METADATA.GET_DDL('USER','EPAY_USER') FROM DUAL;
--获得所有用户的DDL
SELECT DBMS_METADATA.GET_DDL('USER',U.username) FROM DBA_USERS U;