2013-05-17 23 views
2

我是PL/SQL的初學者,所以我不知道這個問題是否合理。我試圖在Oracle 11g中的包(不是在模式下)下找到存儲過程的object_id。我試着查詢我認爲應包含SP的object_Id的以下系統表/視圖。存儲過程中的object_id存儲在Oracle中的哪個位置?

  1. ALL_PROCEDURES
  2. User_obects

的ALL_PROCEDURES觀點確實包含我找SP的名稱,但它僅包含包的對象ID。我想包下找到的存儲過程的object_id的原因是是:

  1. 一些PL/SQL程序員我談的來告訴我,包下的SPS /函數不被視爲一個對象。我想明白爲什麼。

  2. 我想知道,在同一個軟件包下有多少其他SP是否會被引用。我希望public_dependency視圖包含這個映射,除非有人告訴我這是錯誤的觀點。

  3. 如果SP /函數未被標識爲包下的對象,那麼如何獲取引用特定SP的SP列表?

我已經在Stackoverflow中發佈了另一個問題,這導致我到鏈接How do you programatically identify a stored procedure's dependencies?。但是在這篇文章中提到的腳本並沒有幫助我,因爲user_objects沒有包中的存儲過程的任何條目。它只在Schema下有SP。

回答

2

我談過的一些PL/SQL程序員告訴我一個包下的SP /函數不被視爲一個對象。我想明白爲什麼。

oracle數據庫中的包是對邏輯上相關的對象(例如類型,變量,過程和函數)進行分組的模式單元。他們被認爲是原子單位,如果在一個包中的一些程序是指到另一個程序在另一個包,我們有情況,當第一包本身指的是第二包。所以,這裏的最小對象是包裝本身,而不是程序包,類型或包中的其他東西。

我想知道,在同一個軟件包下還有多少其他SP可以參考。我希望public_dependency視圖包含這個映射,除非有人告訴我這是錯誤的觀點。

我從來沒有碰到過的信息如何得到它。如果引用在包內,那麼這個包就是我認爲的獨立對象。

如果SP /函數未被標識爲包下的對象,那麼如何獲取引用特定SP的SP列表?

您需要使用包含源代碼視圖,如user_source/all_source/dba_source

+0

是啊,我的想法是多少第一點相同.. – Sathya

+0

感謝ZZA。我一直髮現,在Oracle中,簡單的事情很難實現(或沒有實現)。 – pradeeptp

0

我不會評論第一點,因爲我不知道Oracle的設計文檔&思考過程。我相信,由於軟件包中定義的程序&包含在依賴於它們的軟件包&中,因此不會爲其分配對象ID。

我想了解,如何在同一包下許多其他的SP這是否SP GET簡稱

最簡單的方法是查詢user_source/all_source/dba_source取決於您的訪問權限。由於這些視圖包含所有源代碼,因此您必須提供適當的過濾器。

如果SP /函數未被標識爲包下的對象,那麼如何獲取引用特定SP的SP列表?

參見上文。

+0

我知道我可以查詢USER_SOURCE,但這並沒有給我的存儲過程的任何特定ID。而且,它不是建立參考樹的非常有效的方法。 – pradeeptp

+0

@pradeeptp你提到你要查找的SP被多少其他的SP簡稱。查詢user_source會爲您提供。如果你11g及以上,你可以嘗試使用PL/Scope。看看甲骨文的PL /範圍(http://stackoverflow.com/q/2781292)[你怎麼能告訴我們,如果一個PL/SQL程序包,正在使用的程序或功能?](HTTP://計算器。 com/q/4670164) – Sathya

+0

感謝您的輸入。我知道我可以查詢user_source表,但是我發現查詢源代碼的引用非常低效。那麼,你能否確認沒有將存儲過程的object_id存儲在包中的表? – pradeeptp