2015-08-27 33 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)。