用dbms_metadata.get_ddl获取ddl语句

本文介绍如何使用Oracle的dbms_metadata函数获取表间外键及约束的创建语句,实现数据导入导出时遵循正确的顺序,确保数据完整性和一致性。

如何抽取数据表的调用关系?

我们在进行数据导入导出等操作时,如果不是按照设计文档比对,经常会出现数据完整性相

关的报错。如a、b表间存在外键关系,a为主表。直接向b表中插入a中没有的数据会报错。
找到a、b表间是否存在着约束关系,就能够有参照地进行处理了。

那么如何得到约束的创建语句,从而找到表之间存在的依赖关系呢?

由于以前用dbms_metadata函数获取过表的创建语句,首先想到是否可以用此函数获取约束的

创建语句呢?

=========================================

dbms_metadata.get_ddl

以前只知道dbms_metadata的get_ddl方法可以用于获取建表语句,因此今天想到是否可以用

其获得其他对象的创建语句呢?
参考资料:
http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10802/d_metada.htm#

998564
http://blog.youkuaiyun.com/wh62592855/article/details/4697840

第一份参考资料中对于该函数的讲解比较全面,但对于哪些对象可以用此函数获取并未明确

,第二份参考资料则更加实际,例举了一些常见待获取ddl语句的对象。

我在oracle 9i环境中运行了如下语句:
select dbms_metadata.get_ddl('TABLE','EMP','SCOTT')  from dual;--获取表的创建语句
select dbms_metadata.get_ddl('INDEX','EMP_IDX','SCOTT')  from dual;--获取索引的创

建语句
select dbms_metadata.get_ddl('FUNCTION','GET_USER','SCOTT')  from dual;--获取函数

的创建语句
select dbms_metadata.get_ddl('PACKAGE','PCK_DBADMIN_GETDDL','SCOTT')  from dual;

--获取包、包体的创建语句 
select dbms_metadata.get_ddl('VIEW','EMP_DEPT_02','SCOTT')  from dual;--获取视图

的创建语句
select dbms_metadata.get_ddl('SEQUENCE','TEMP_SEQ','SCOTT')  from dual;--获取序列

的创建语句
select dbms_metadata.get_ddl('MATERIALIZED_VIEW','EMP_DEPT_01','SCOTT')  from

dual;--获取物化视图的创建语句
select dbms_metadata.get_ddl('TRIGGER','CHECK_MGR','SCOTT')  from dual;--获取物化

视图的创建语句
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type not in('R','O','C');
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='R';--获取参照性约束的创建语句,报错
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='F';--实验环境中没有结果
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='O';--实验环境中没有结果
select constraint_name,dbms_metadata.get_ddl('CONSTRAINT',constraint_name,owner)

from user_constraints where constraint_type ='U';--获取唯一约束的创建语句,有结果
select dbms_metadata.get_ddl('CONSTRAINT','FK_DEPTNO','SCOTT')  from dual;--获取

物化视图的创建语句
select dbms_metadata.get_ddl('USER','SCOTT')  from dual;--获取用户的创建语句
select dbms_metadata.get_ddl('TABLESPACE','SYSTEM')  from dual;--获取表空间的创建

语句
select dbms_metadata.get_ddl('SYNONYM','DUAL')  from dual;--获取同义词的创建语句
select dbms_metadata.get_ddl('','DUAL')  from dual;--获取同义词的创建语句

 

此函数可以进行处理的对象包括:

物化视图
索引
函数
包、包体
触发器
序列
同义词
等等

不能处理的对象包括dblinks、外键约束等

需要注意的是:
(1)产生的语句中,对象名称是用双引号包含的
(2)语句中的空格数是和原始数据不一样的(具体原因无法理解,但直接调用可能会有问题


(3)语句中的object_type项必须严格大写,且不能有拼写错误
(4)约束的获取比较特殊,后面详述
(5)通过数据字典可以更加方便地获得ddl语句
(如:获得所有用户的ddl,语句为
select username,dbms_metadata.get_ddl('USER',username) from dba_users;)


============================================================================

用这种方法并不能得到我们想要的外键约束详细内容。oracle中外键的详细内容似乎不是从

dba/user/all_constraints中得到的。然而,我们应该看到:某张表中的外键列应该是另外

某张表上的主键。

通过外键名找到约束的名称和其参照的约束名称(也就是主表上的主键名)。如果我们通过

层次查询,就可以找到其对应关系,从而分析出哪些表需要先创建。

外键的定义格式为alter table table_name add constraint constraint_name foreign

key(column_name) references tab2_name(tab2_column_name);

 

通过以下语句,可以获得表之间的外键联系
select level,uc.table_name||'->'||u.table_name "primary->standbys" from

user_constraints u,user_constraints uc
where u.r_constraint_name=uc.constraint_name
start with uc.table_name not in
(select table_name from user_constraints where constraint_type='R')
connect by prior u.table_name=uc.table_name
order by level

这样,在导入数据时就需要按照level级别,首先处理不存在外键调用的,每次保证导入的数

据不违反约束条件。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-747868/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-747868/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值