ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 用dbms_metadata.get_ddl获取ddl语句

用dbms_metadata.get_ddl获取ddl语句

原创 Linux操作系统 作者:to_be_dba 时间:2012-10-30 09:15:31 0 删除 编辑

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

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

关的报错。如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.csdn.net/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博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-747868/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: a=b and b=c 问题
请登录后发表评论 登录
全部评论

注册时间:2011-11-23

  • 博文量
    170
  • 访问量
    484895