我在Oracle中得到了这三个巨型模式,我称它们为db层(L3,L2,L1)。 在每个图层中,我都有很多可能会从其底层调用某些过程的SP。现在为了文档的目的,我需要绘制一些东西像树,以显示这些连锁调用。那么我不想介入手动提取这些数据的苦差事。在oracle中查找SP链调用
问题是,有没有一种自动的方式来做到这一点?就像查询谁来呼叫谁一样。
我在Oracle中得到了这三个巨型模式,我称它们为db层(L3,L2,L1)。 在每个图层中,我都有很多可能会从其底层调用某些过程的SP。现在为了文档的目的,我需要绘制一些东西像树,以显示这些连锁调用。那么我不想介入手动提取这些数据的苦差事。在oracle中查找SP链调用
问题是,有没有一种自动的方式来做到这一点?就像查询谁来呼叫谁一样。
我只是摆弄周围一点点。所以也许就像一个起点。
用您的模式替换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
获取所有依赖您的架构的这个查询:
SELECT * FROM all_dependencies其中所有者= 'your_schema_name'
出口查询的结果JSON(或任何其他格式)。
您可以查询从字典你的程序的依赖关系,但我不认为你可以生成仅基于Oracle数据库顺序调用图。你可能会依赖于第三方解决方案,我相信这里有PL/SQL代码分析工具。 –
如果您可以提取元数据,那么您可能会发现它非常复杂,并且每次修改代码库时都会发生更改。我建议使用GraphViz来自动绘制依赖关系,所以你需要的只是让SQL生成适当的文件格式,或者只是包含关系的部分。我已经为DBMS_Scheduler链,任务和程序成功完成了这个任务。您也可以扩展该方法以包含视图和表格。 –