0
点赞
收藏
分享

微信扫一扫

记录一下Orale获取表DDL语句的过程

王小沫 2023-07-24 阅读 12
正文:

工作上数据库搭建测试环境  只需要部分表进行测试  不要求环境完全一样,给出让导出一两张表的表结构在新库建立即可。

这里我用到 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;


举报

相关推荐

0 条评论