2015-08-27 35 views
1

我在Oracle中得到了这三个巨型模式,我称它们为db层(L3,L2,L1)。 在每个图层中,我都有很多可能会从其底层调用某些过程的SP。现在为了文档的目的,我需要绘制一些东西像树,以显示这些连锁调用。那么我不想介入手动提取这些数据的苦差事。在oracle中查找SP链调用

问题是,有没有一种自动的方式来做到这一点?就像查询谁来呼叫谁一样。

enter image description here

+0

您可以查询从字典你的程序的依赖关系,但我不认为你可以生成仅基于Oracle数据库顺序调用图。你可能会依赖于第三方解决方案,我相信这里有PL/SQL代码分析工具。 –

+1

如果您可以提取元数据,那么您可能会发现它非常复杂,并且每次修改代码库时都会发生更改。我建议使用GraphViz来自动绘制依赖关系,所以你需要的只是让SQL生成适当的文件格式,或者只是包含关系的部分。我已经为DBMS_Scheduler链,任务和程序成功完成了这个任务。您也可以扩展该方法以包含视图和表格。 –

回答

1

我只是摆弄周围一点点。所以也许就像一个起点。

用您的模式替换DBA_OBJECTS.OWNER IN('HUSQVIK')。

WITH leafs AS (
    SELECT 
     DBA_OBJECTS.OWNER, DBA_OBJECTS.OBJECT_NAME NAME, 
     CASE WHEN COUNT(PARENT_REFERENCES.REFERENCED_NAME) > 0 THEN 1 ELSE 0 END IS_REFERENCED, 
     CASE WHEN COUNT(CHILD_REFERENCES.NAME) > 0 THEN 1 ELSE 0 END HAS_REFERENCES 
    FROM 
     DBA_OBJECTS 
     LEFT JOIN DBA_DEPENDENCIES PARENT_REFERENCES ON DBA_OBJECTS.OWNER = PARENT_REFERENCES.REFERENCED_OWNER AND DBA_OBJECTS.OBJECT_NAME = PARENT_REFERENCES.REFERENCED_NAME 
     LEFT JOIN DBA_DEPENDENCIES CHILD_REFERENCES ON DBA_OBJECTS.OWNER = CHILD_REFERENCES.OWNER AND DBA_OBJECTS.OBJECT_NAME = CHILD_REFERENCES.NAME 
    WHERE 
     OBJECT_TYPE IN ('PACKAGE BODY', 'FUNCTION', 'PROCEDURE') 
     AND DBA_OBJECTS.OWNER IN ('HUSQVIK') 
    GROUP BY 
     DBA_OBJECTS.OWNER, DBA_OBJECTS.OBJECT_NAME 
) 
SELECT 'Entry point -> ' || OWNER || '.' || NAME DEPENDENCY_PATH, 1 MAX_STACK_DEPTH FROM leafs WHERE leafs.IS_REFERENCED = 0 AND leafs.HAS_REFERENCES = 0 
UNION ALL 
SELECT 
    DEPENDENCY_PATH, STACK_DEPTH 
FROM (
    SELECT 
     'Entry point -> ' || 
     CONNECT_BY_ROOT DBA_DEPENDENCIES.OWNER || '.' || CONNECT_BY_ROOT DBA_DEPENDENCIES.NAME || 
     SYS_CONNECT_BY_PATH(DBA_DEPENDENCIES.REFERENCED_OWNER || '.' || DBA_DEPENDENCIES.REFERENCED_NAME, ' -> ') DEPENDENCY_PATH, 
     CONNECT_BY_ISLEAF ISLEAF, 
     LEVEL + 1 STACK_DEPTH 
    FROM 
     DBA_DEPENDENCIES 
     LEFT JOIN 
      (SELECT * FROM leafs WHERE leafs.IS_REFERENCED = 0) roots 
     ON roots.OWNER = DBA_DEPENDENCIES.OWNER AND roots.NAME = DBA_DEPENDENCIES.NAME 
    WHERE 
     DBA_DEPENDENCIES.REFERENCED_TYPE IN ('PACKAGE BODY', 'FUNCTION', 'PROCEDURE') 
    START WITH 
     roots.NAME IS NOT NULL 
    CONNECT BY NOCYCLE 
     PRIOR DBA_DEPENDENCIES.REFERENCED_OWNER = DBA_DEPENDENCIES.OWNER AND 
     PRIOR DBA_DEPENDENCIES.REFERENCED_NAME = DBA_DEPENDENCIES.NAME) 
WHERE ISLEAF = 1 
1
  1. 获取所有依赖您的架构的这个查询

    SELECT * FROM all_dependencies其中所有者= 'your_schema_name'

  2. 出口查询的结果JSON(或任何其他格式)。

  3. 进程依赖关系的JSON到生成树(s)。