如何抽取数据表的调用关系?
我们在进行数据导入导出等操作时,如果不是按照设计文档比对,经常会出现数据完整性相
关的报错。如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/
本文介绍如何使用Oracle的dbms_metadata函数获取表间外键及约束的创建语句,实现数据导入导出时遵循正确的顺序,确保数据完整性和一致性。
8304

被折叠的 条评论
为什么被折叠?



