将测试数据填充到oracle数据库

时间:2011-05-03 16:15:50

标签: oracle10g

我有一个oracle数据库模式与更复杂的外键关系..我需要将测试数据填充到所有表..由于外键约束我发现很难找到表的层次结构..任何人都可以建议任何包或方法来完成这个..

提前致谢

2 个答案:

答案 0 :(得分:6)

如果您能告诉我们您想要输出的格式,将会很有帮助。您可能想从Frank Kulash的example of a hierarchial query against the DBA_CONSTRAINTS table开始展示路径。

如果您正在寻找一种方法来确定加载表的顺序,那与question that was asked on dba.stackexchange相同(不能将此问题标记为重复,因为DBA仍处于测试阶段)。像

这样的东西
WITH    constraint_tree AS
(
    SELECT DISTINCT
        a.table_name    AS table_name
    ,   b.table_name    AS parent_table_name
    FROM        dba_constraints a
    LEFT OUTER JOIN dba_constraints b
    ON      a.r_constraint_name = b.constraint_name
    AND     a.owner         = b.owner
    WHERE       a.owner = 'SCOTT'
)
SELECT table_name, lvl
  FROM (
    SELECT a.*,
           rank() over (partition by table_name order by lvl desc) rnk
      FROM (
        SELECT  table_name, level lvl
          FROM  constraint_tree
         START WITH parent_table_name   IS NULL
       CONNECT BY NOCYCLE parent_table_name = PRIOR table_name
      ) a 
    ) b
 WHERE rnk = 1
 ORDER BY lvl, table_name
/

将按照应加载的顺序为您提供表格(假设数据中没有循环)。如果要并行加载,则可以同时加载具有相同LVL的所有表。

答案 1 :(得分:2)

如果表的层次结构非常复杂,并且您可以单独访问模式(即对用户施加一些“停机时间”),则可以禁用所有外键约束,加载数据,然后重新 - 启用约束。

另一种选择是使用可延迟约束,并且只将它们推迟到正在加载数据的会话中;但是有一些缺点,一个是你首先必须放弃所有约束,以便在它们尚未推出时使它们可以延迟。