利用dbms_metadata.get_ddl查看DDL语句

本文介绍如何使用Oracle的dbms_metadata.get_ddl函数查询数据库对象的DDL语句,包括表、索引、视图等,并提供了多种实用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看。

dbms_metadata包中的get_ddl函数详细参数
GET_DDL函数返回创建对象的原数据的DDL语句,详细参数如下
-- object_type ---需要返回原数据的DDL语句的对象类型
-- name --- 对象名称
-- schema ---对象所在的Schema,默认为当前用户所在所Schema
-- version ---对象原数据的版本
-- model ---原数据的类型默认为ORACLE
-- transform. - XSL-T transform. to be applied.
-- RETURNS: 对象的原数据默认以CLOB类型返回

dbms_metadata包中的get_ddl函数定义
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;


注意如果使用sqlplus需要进行下列格式化,特别需要对long进行设置,否则无法显示完整的SQL

set linesize 180
set pages 999
set long 90000

查看创建用户表的SQL

查看当前用户表的SQL
select dbms_metadata.get_ddl('TABLE','EMPLOYEES') from dual;
查看其他用表或索引的SQL

SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;

查看创建用户索引的SQL
查看所需表的索引
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME from user_indexes WHERE table_name='EMP';
查看当前用户索引的SQL
select dbms_metadata.get_ddl('INDEX','PK_DEPT') from dual;

查看其他用户索引的SQL
select dbms_metadata.get_ddl('INDEX','PK_DEPT','SCOTT‘) from dual;
查看创建主键的SQL
查看所需表的约束
SQL> select owner, table_name, constraint_name, constraint_type from user_constraints where table_name='EMP';
查看创建主键的SQL
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','EMP_PK') FROM DUAL;
查看创建外键的SQL
SQL> SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT','EMP_FK_DEPT') FROM DUAL;
查看创建VIEW的语句
查看当前用户视图的SQL
SQL> SELECT dbms_metadata.get_ddl('VIEW', 'MY_TABLES')

查看其他用户视图的SQL
SQL> SELECT dbms_metadata.get_ddl('VIEW', 'MY_TABLES','SCOTT‘) FROM DUAL;
查看创建视图的SQL也可以
SQL> select text from user_views where view_name=upper('&view_name');
DBMS_METADATA.GET_DDL的一些使用技巧
1、得到一个用户下的所有表,索引,存储过程,函数的ddl
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)
FROM USER_OBJECTS u
where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE','FUNCTION‘);
2、得到所有表空间的ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)
FROM DBA_TABLESPACES TS;
3、得到所有创建用户的ddl
SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U;
4、去除storage等多余参数
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);


常见错误

SQL> select dbms_metadata.get_ddl('TABLE','PC','SCOTT') from dual;
ERROR:
ORA-19206: Invalid value for query or REF CURSOR parameter
ORA-06512: at "SYS.DBMS_XMLGEN", line 83
ORA-06512: at "SYS.DBMS_METADATA", line 345
ORA-06512: at "SYS.DBMS_METADATA", line 410
ORA-06512: at "SYS.DBMS_METADATA", line 449
ORA-06512: at "SYS.DBMS_METADATA", line 615
ORA-06512: at "SYS.DBMS_METADATA", line 1221
ORA-06512: at line 1

no rows selected

解决办法:运行 $ORACLE_HOME/rdbms/admin/catmeta.sql


参考至:http://czmmiao.iteye.com/blog/1004873

http://hi.baidu.com/suofang/blog/item/fac7cffdaad7a942d6887d80.html

本文原创,转载请注明出处、作者

如有错误,欢迎指正
<think>好的,用户在使用Oracle的DBMS_METADATA.GET_DDL时遇到了SQL被截断的问题,我需要帮他解决这个问题。首先,我得回忆一下DBMS_METADATA.GET_DDL的输出机制。这个函数返回的是CLOB类型的数据,CLOB可以存储大量的字符数据,但不同的客户端工具处理CLOB的方式可能不同,特别是像SQL*Plus这样的命令行工具可能会有默认的显示限制。 用户提到输出被截断,这可能是因为客户端设置的显示长度不够。例如,SQL*Plus中的LONG参数默认是80个字符,这会导致较长的DDL语句显示不全。所以解决方法可能是调整这些参数,比如设置SET LONG 100000或者更大的值,同时设置PAGESIZE为0,避免分页打断输出。 另外,用户可能是在使用其他工具,比如PL/SQL Developer或SQL Developer,这些工具可能也有自己的显示设置,需要检查是否有类似的限制。如果用户使用的是SQL Developer,可能需要调整显示的选项,或者在导出时直接保存到文件,避免在界面中显示不全。 还有一种可能是用户没有正确获取完整的DDL,比如没有处理转换参数,导致部分存储参数被省略。这时候可能需要使用DBMS_METADATA.SET_TRANSFORM_PARAM来调整输出格式,比如禁用STORAGE参数,或者启用更详细的转换选项。 另外,用户可能需要生成多个相关对象的DDL,比如索引、约束等,这时候可能需要使用ADD_TRANSFORM函数来包含这些对象。但用户的问题主要在于截断,所以重点应该放在客户端设置上。 我还需要确认用户是否在查询时正确使用了函数,比如是否遗漏了schema参数,或者表名是否正确大写,因为Oracle的数据字典是区分大小写的,如果表名没有正确大写,可能导致查询不到结果,但用户的问题是关于截断,所以可能不是这个原因。 最后,可能需要建议用户将结果输出到文件,避免客户端的显示限制,或者使用其他工具如TOAD,这些工具可能自动处理CLOB的显示问题。同时,提醒用户检查是否有权限问题,但之前的回答已经提到过权限,这里可能不是主要原因。 总结一下,用户的问题可能出在客户端工具的显示设置,特别是LONG和PAGESIZE的设置,需要指导用户调整这些参数,或者将结果保存到文件中,确保完整输出。同时,可以提到使用其他方法如SQL Developer导出DDL,避免截断问题。</think>在Oracle中使用 `DBMS_METADATA.GET_DDL` 时出现SQL截断问题,通常是由于客户端工具的默认显示限制导致的。以下是详细解决方案: --- ### **问题原因** 1. **CLOB字段显示限制** `DBMS_METADATA.GET_DDL` 返回的数据类型是 `CLOB`,而SQL*Plus等工具的默认设置(如 `LONG` 参数)会限制大文本的显示长度。 2. **工具缓冲区限制** 部分数据库工具(如PL/SQL Developer)的查询结果窗口有默认的字符长度限制。 --- ### **解决方案** #### **方法1:调整SQL*Plus设置** 在命令行工具中执行以下命令: ```sql SET LONG 1000000 -- 设置CLOB显示长度(默认80) SET LONGCHUNKSIZE 1000000 -- 设置分段读取长度 SET PAGESIZE 0 -- 禁用分页显示 SET LINESIZE 32767 -- 设置单行最大宽度(可选) ``` **执行示例**: ```sql SQL> SET LONG 1000000 SQL> SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP') FROM DUAL; ``` --- #### **方法2:通过TOAD/SQL Developer导出** - **在SQL Developer中**: 1. 执行查询后,右键点击结果网格中的 `CLOB` 字段 2. 选择 **Export Single Cell...** 3. 将完整DDL保存到文件 - **在TOAD中**: 1. 右键点击查询结果中的 `CLOB` 字段 2. 选择 **Open in Editor** 查看完整内容 --- #### **方法3:强制转换为VARCHAR2(慎用)** ```sql SELECT TO_CHAR(DBMS_METADATA.GET_DDL('TABLE', 'EMP')) AS DDL FROM DUAL; ``` ⚠️ 注意:`VARCHAR2` 最大支持4000字节,超长文本仍会被截断,仅适用于简单表结构。 --- #### **方法4:直接导出到文件** 在SQL*Plus中: ```sql SPOOL /path/to/output.sql SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP') FROM DUAL; SPOOL OFF ``` --- ### **高级配置** 通过元数据转换参数优化输出: ```sql BEGIN -- 禁用存储参数(减少输出长度) DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE ); -- 禁用表空间参数 DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE ); END; / ``` --- ### **验证方法** 通过 `LENGTH` 函数检查实际长度: ```sql SELECT LENGTH(DBMS_METADATA.GET_DDL('TABLE', 'EMP')) AS DDL_LENGTH FROM DUAL; ``` 如果返回数值远大于客户端工具的显示限制,则确认是工具设置问题。 --- ### **最佳实践** 1. **优先使用SQL Developer** → 通过 **View > DDL** 自动生成完整SQL 2. **复杂对象导出** → 使用 `expdp` 数据泵工具: ```bash expdp user/password DIRECTORY=DATA_PUMP_DIR DUMPFILE=ddl.dmp CONTENT=METADATA_ONLY ``` 通过上述方法,可以彻底解决DDL语句被截断的问题。如果问题持续,请检查数据库版本(建议使用11g+)和工具兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值