达梦数据库提供了各类对象定义的查看函数,这里废话不多说,上干货。
--方式一:
SQL> sp_tabledef('SYSDBA','TEST');
--方式二:
SQL> SELECT dbms_metadata.get_ddl('TABLE','TEST','SYSDBA');
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS CHAR_TAB';
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CHAR_TAB(C1 VARCHAR) ON COMMIT PRESERVE ROWS';
FOR I IN (SELECT OBJECT_NAME
FROM ALL_OBJECTS
WHERE OWNER='SYSDBA'
AND OBJECT_TYPE='TABLE')
LOOP
EXECUTE IMMEDIATE 'INSERT INTO CHAR_TAB SELECT TO_CHAR(DBMS_METADATA.GET_DDL(''TABLE'','''||I.OBJECT_NAME||''',''SYSDBA''));';
END LOOP;
END;
SELECT * FROM CHAR_TAB;
--方式一:创建索引后,可以通过 INDEXDEF 系统函数查看索引的定义。
INDEXDEF(INDEX_ID int, PREFLAG int);
--INDEX_ID 为索引 ID,PREFLAG 表示返回信息中是否增加模式名前缀。
--索引ID查看方法
select name,id,subtype$ from sysobjects where subtype$='INDEX' and name='IND_EMP_DEP';
--方式二:使用DBMS_METADATA.GET_DDL查看索引DDL
---如果是全文索引,请将TYPE值调整为CONTEXT_INDEX
SELECT DBMS_METADATA.GET_DDL('INDEX','INDEX_NAME','SCHEMA');
---如果是全文索引,请将TYPE值调整为CONTEXT_INDEX
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS CHAR_TAB';
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CHAR_TAB(C1 TEXT) ON COMMIT PRESERVE ROWS';
FOR I IN (select OBJECT_NAME from "SYS"."ALL_OBJECTS" where owner='SYSDBA' AND OBJECT_TYPE='INDEX' and "OBJECT_NAME" not like 'INDEX33%')
LOOP
EXECUTE IMMEDIATE 'INSERT INTO CHAR_TAB SELECT TO_CHAR(DBMS_METADATA.GET_DDL(''INDEX'','''||I.OBJECT_NAME||''',''SYSDBA''));';
END LOOP;
END;
SELECT TO_CHAR(C1) FROM CHAR_TAB;
DROP TABLE IF EXISTS CHAR_TAB;
看到这里其实大家会发现DBMS_METADATA.GET_DDL方法会比较通用(完整语法参考《DM8系统包使用手册》),不同类型对象只需要调整TYPE类型,如TABLE、INDEX、VIEW、SEQUENCE、MATERIALIZED_VIEW、MATERIALIZED_VIEW_LOG等即可实现对特定某类对象的定义获取,结合前面2个获取批量定义的语句块,就能轻松实现数据库对象定义的批量获取。
当然其他对象也是有专用的内置函数来获取,比如CONTEXT_INDEX_DEF --全文索引
SEQDEF --序列
INDEXDEF --索引
CONSDEF --约束
CHECKDEF --检查
1、获取对象ID
select name,id,subtype$ from sysobjects where subtype$='对象类型' and name='对象名';
2、查看ddl(xxxDEF换成具体获取ddl函数如INDEXDEF、CONSDEF等)
select xxxDEF(id,1)
文章
阅读量
获赞
