เป็นไปได้ไหมที่จะเขียนแบบสอบถาม PL/SQL เพื่อระบุรายการการขึ้นต่อกันของโพรซีเดอร์ที่เก็บไว้ทั้งหมด ฉันสนใจที่จะระบุขั้นตอนการจัดเก็บอื่น ๆ เท่านั้นและฉันไม่ต้องการจำกัดความลึกของการซ้อนที่ได้รับเช่นกัน ตัวอย่างเช่น ถ้า A เรียก B ซึ่งเรียก C ซึ่งเรียก D ฉันต้องการให้ B, C และ D รายงานว่าเป็นการขึ้นต่อกันของ A
คุณจะระบุการขึ้นต่อกันของกระบวนงานที่เก็บไว้โดยทางโปรแกรมได้อย่างไร
คำตอบ (4)
ในหน้านี้ คุณจะพบข้อความค้นหาต่อไปนี้ซึ่งใช้ PUBLIC_DEPENDENCY ตารางพจนานุกรม:
SELECT lvl
, u.object_id
, u.object_type
, LPAD (' ', lvl) || object_name obj
FROM ( SELECT LEVEL lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id =
( SELECT object_id
FROM user_objects
WHERE object_name = UPPER ('&OBJECT_NAME')
AND object_type = UPPER ('&OBJECT_TYPE'))
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY LEVEL, object_id) tree
, user_objects u
WHERE tree.object_id = u.object_id
ORDER BY lvl
/
ฉันเห็นด้วยกับ EddieAwad
มีประโยชน์ที่จะชี้ให้เห็นว่า Oracle ติดตามการขึ้นต่อกันจนถึงระดับอ็อบเจ็กต์เท่านั้น หากคุณมีขั้นตอนการจัดเก็บของคุณในแพ็คเกจ คุณสามารถติดตามการขึ้นต่อกันเท่านั้นหากแพ็คเกจนั้น ไม่ใช่ฟังก์ชัน/ขั้นตอนแต่ละรายการภายในแพ็คเกจ
หากคุณต้องการติดตามการขึ้นต่อกันภายในแพ็คเกจ คุณจะต้องมีตัวแยกวิเคราะห์ PLSQL
สิ่งอื่นที่ควรชี้ให้เห็นที่นี่คือมีบางกรณีที่การขึ้นต่อกันอาจอยู่ที่รันไทม์เท่านั้น ซึ่งน่าเสียดายที่จะไม่แสดงในข้อมูลเมตา
ตัวอย่างเช่น หากคุณกำลังสร้างคำสั่ง SQL ขณะรันไทม์ คุณอาจมีโค้ดที่คล้ายกับ:
...
mysql := 'select count(*) from '||table_name_in;
execute immediate mysql;
...
ฉันรู้สึกแย่กับสิ่งนี้มาสองสามครั้งแล้ว แต่น่าเสียดายที่ไม่มีทางที่จะค้นหาการขึ้นต่อกันประเภทนี้ล่วงหน้าได้ เนื่องจากอาจขึ้นอยู่กับอินพุตของผู้ใช้
หากต้องการดูรายละเอียดทั้งหมด:
select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME'