คุณจะหาตำแหน่งที่ใช้โพรซีเดอร์ที่เก็บไว้ได้อย่างไร (ในโพรซีเดอร์อื่นที่เก็บไว้)


10

ฉันมีขั้นตอนการจัดเก็บที่ฉันต้องการ refactor ในฐานข้อมูลที่มี SP หลายพันรายการ มีวิธีที่รวดเร็วในการค้นหาการอ้างอิงไปยังกระบวนงานที่เก็บไว้ใน SP อื่น ๆ เพื่อให้ฉันสามารถมั่นใจได้ว่าฉันจะไม่ทำลายรหัสอื่น ๆ เมื่อฉัน refactor

ในรหัสแอปพลิเคชันฉันสามารถค้นหาการเรียกไปที่ SP ได้อย่างง่ายดายและฉันสามารถค้นหาข้อความผ่านไฟล์ sql ต่างๆที่กำหนด SPs ได้ แต่อาจเป็นไปได้ที่อาจมี SP บางตัวในฐานข้อมูลซึ่งอาจพลาดวิธีนั้น .

แก้ไข: ขั้นตอนการจัดเก็บฉันพยายามค้นหาเป็นส่วนหนึ่งของแพคเกจ

แก้ไข: ฉันใช้ Oracle 11g

คำตอบ:


11

DBA_DEPENDENCIES มุมมองมีคำตอบทั้งหมดสำหรับคำถามดังกล่าว

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';

2
วิธีการนี้จะไม่ทำงานหากคุณใช้ dynamic sql เช่นถ้าคุณดำเนินการตามขั้นตอนเป็นส่วนหนึ่งของ dynamic sql มิฉะนั้น dba_ หรือ all_dependencies จะทำงานได้ดี
Raj

1
สิ่งนี้มีประโยชน์และฉันสามารถค้นหาฟังก์ชันและโพรซีเดอร์ที่ผู้ใช้กำหนด แต่ดูเหมือนว่าฉันจะไม่พบ FN หรือ SP ที่กำหนดไว้ในแพ็คเกจ ความคิดใด ๆ
Peter Bagnall

ในกรณีนี้เราต้องค้นหาแพ็คเกจ DBA_DEPENDENCIESแสดงให้เราเห็นมากขึ้นเช่นสิ่งที่จะถูกทำให้เป็นโมฆะหากวัตถุเฉพาะถูกวาง ดังนั้นเช่นคุณสามารถค้นหาตารางอ้างอิงมุมมองได้
Mindaugas Riauba

6

สิ่งนี้ดูเหมือนจะใช้งานได้ - มันหรูหราน้อยกว่าคำตอบของ @ MindaugasRiauba แต่ดูเหมือนจะหาข้อมูลอ้างอิงจากแพ็คเกจทั้งหมด

SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%STORED_PROCEDURE_NAME%')

(จากคุณจะทราบได้อย่างไรว่ามีการใช้แพคเกจ PL / SQL, ขั้นตอนหรือฟังก์ชั่นหรือไม่? )


0

ฉันมีสถานการณ์ที่คล้ายกันเฉพาะฉันเท่านั้นที่จำเป็นต้องเรียกคืนรายการแพคเกจที่ใช้แพ็คเกจเฉพาะ ดังนั้นฉันทำแบบสอบถามนี้อาจช่วย:

with dep2 as (
    select dep.*
    from all_dependencies dep
    where dep.owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_type = 'PACKAGE'
    and dep.dependency_type != 'NON-EXISTENT'
    and (dep.referenced_owner || '.' || dep.referenced_name) != (dep.owner || '.' || dep.name)
),
dep3 as (
    select owner || '.' || name as child,
    referenced_owner || '.' || referenced_name as parent
    from dep2
)
select connect_by_root parent, lpad(' ',2*(level-1)) || to_char(child) 
from dep3
start with parent = 'SCHEMA.PACKAGE_NAME'
connect by nocycle prior child = parent 
and exists (select 1 from all_source where (owner || '.' || name) = dep3.child and upper(text) like upper('%optional, some string you may want to search%')) 
;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.