使用dbms_metadata.get_ddl生成表DDL时如何排除约束与索引?
让dbms_metadata.get_ddl不生成索引与约束的方法
可以通过DBMS_METADATA.SET_TRANSFORM_PARAM函数设置会话级转换参数,精准控制GET_DDL生成的内容,完全跳过索引、约束(包括外键)的生成。
具体步骤与示例代码
禁用索引与约束生成
在调用GET_DDL前执行以下PL/SQL语句,修改会话的转换规则:-- 禁用主键、唯一约束等常规约束生成 EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS', FALSE); -- 禁用所有索引生成(包括主键对应的唯一索引) EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'INDEXES', FALSE); -- 禁用外键约束生成 EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS', FALSE); -- 确保约束不会以ALTER TABLE语句形式生成 EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS_AS_ALTER', FALSE);生成仅含表结构的DDL
之后执行GET_DDL即可得到不带索引、约束的表定义:SELECT DBMS_METADATA.GET_DDL('TABLE', '你的表名', '表所属用户') FROM DUAL;
后续补充:单独生成索引/约束DDL
如果需要在数据加载完成后单独生成约束或索引的DDL,只需重新调整转换参数:
生成外键约束
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS', FALSE); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'INDEXES', FALSE); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS', TRUE); SELECT DBMS_METADATA.GET_DDL('TABLE', '你的表名', '表所属用户') FROM DUAL;生成索引
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'INDEXES', TRUE); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS', FALSE); EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS', FALSE); SELECT DBMS_METADATA.GET_DDL('INDEX', '你的索引名', '索引所属用户') FROM DUAL;
重置参数(可选)
如果需要恢复GET_DDL的默认行为,执行以下语句重置会话转换参数:
EXEC DBMS_METADATA.RESET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM);
内容的提问来源于stack exchange,提问作者dnraikes
相关产品推荐
相关产品推荐

