为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8 DB Version: 0x7000c
【操作系统】:
【CPU】:
【问题描述】*:dbms_metadata.get_ddl生成建表语句时没有字段描述,请问怎样才能生成建表语句同时生成字段的描述说明呢
表信息如下:
1、执行以下Sql有建表语句返回,但没有字段描述说明
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TEST_0626', 'TESTDBA') AS TABLE_DDL FROM DUAL;
2、执行以下Sql报错
SELECT DBMS_METADATA.GET_DDL('TABLE', 'my_table', 'my_schema', 'ZHS16GBK', 'COMMENTS') AS TABLE_DDL FROM DUAL;
-- 表定义
SELECT DBMS_METADATA.GET_DDL('TABLE', '表名', '模式名') AS TABLE_DDL FROM DUAL;
-- 注释
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT', '表名', '模式名') AS TABLE_DDL FROM DUAL;
达梦的注释和表定义是分开的
参考手册:
https://eco.dameng.com/document/dm/zh-cn/pm/dbms_metadata-package.html
写了个存储过程
调用方法:show_create_table('你的DB','你的TB');
CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) AS
sql1 text;
ret text := '';
cmt text :='';
sql2 text :='';
BEGIN
FOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOP
ret:= ret||WSX.DDL;
END LOOP;
ret := ret||chr(10);
-- print ret;
FOR ZXCV IN (select INDEX_NAME from ALL_INDEXES where TABLE_OWNER=db and TABLE_NAME=tb ) LOOP
sql1 := 'select dbms_metadata.get_ddl(''INDEX'','''||ZXCV.INDEX_NAME||''','''||db||''') from dual';
for QAZ IN (select dbms_metadata.get_ddl('INDEX',ZXCV.INDEX_NAME,DB)as DDL from dual ) LOOP
ret:= ret||QAZ.DDL;
ret := ret||chr(10);
END LOOP;
END LOOP;
-- print ret;
ret := ret||chr(10);
ret := ret||chr(13);
FOR TAB_CMT IN (select * from DBA_TAB_COMMENTS where OWNER=db AND TABLE_NAME=tb) LOOP
cmt:= cmt||'COMMENT ON TABLE '||TAB_CMT.OWNER||'.'||TAB_CMT.TABLE_NAME||' IS '''||TAB_CMT.COMMENTS||''';'||char(10);
END LOOP;
FOR COL_CMT IN (select * from DBA_COL_COMMENTS where OWNER=db AND TABLE_NAME=tb) LOOP
cmt:= cmt||'COMMENT ON COLUMN '||COL_CMT.OWNER||'.'||COL_CMT.TABLE_NAME||'('||COL_CMT.COLUMN_NAME||') IS '''||COL_CMT.COMMENTS||''';'||char(10);
END LOOP;
print cmt;
sql2 := 'select '''|| ret ||''' as ddl';
--print sql2;
EXECUTE IMMEDIATE sql2;
END;
用达梦自带的管理工具,找到对应的表,选择属性就可以看到;