2010-07-09 62 views
5

我可以使用all_arguments和all_procedures列出任何給定包中的過程和函數,並使用DBMS_METADATA我可以提取該包的DDL。是否有一種簡單的方法(除了大量的instring和substring調用)能夠爲程序包中的每個獨立代碼塊分別獲取過程或函數源代碼。特定存儲過程或函數的源代碼

類似這樣的:

Owner |包名稱|對象名稱|過載|參數|來源

顯然使用子字符串和instring會出現重載函數的問題。

All_arguments有subprogram_id字段,根據它的非常稀疏的文檔,它看起來像唯一地引用它在程序包中涉及的哪個過程,但似乎沒有任何使用它的東西。

歡呼聲提前

+0

提取函數定義的目的是什麼? – 2010-07-09 10:25:59

+0

我的意思是以類似DDL的方式定義 - 改爲源代碼,嘗試更清楚地說明我試圖列出特定過程或函數的代碼 – Chris 2010-07-09 10:31:08

+0

「列出代碼」在文件中隔離? – 2010-07-09 10:43:30

回答

3

IIRC,PLSQL允許嵌套的包和函數。在這種情況下,您會發現「instring」和「substring」可能不足以提取源代碼,因爲您面臨遞歸,而字符串函數通常只處理較小的計算類別(通常爲正則表達式)。這是人們試圖用簡單的字符串操作解析語言的經典問題。你可以繞過字符串函數的限制,通過本質上的黑客來產生一個窮人的解析器,但如果你希望它是致命的,這可能是一個驚人的工作量,因爲你必須處理至少對你而言重要的遞歸語法規則萃取。

獲得可靠訪問PLSQL包元素的另一種方法是使用語言解析器。 DMS Software Reengineering Toolkit有一個完整的PLSQL解析器。

您必須首先將包文本解壓到文件,然後將PLSQL解析器應用到它;它在解析器內部生成抽象語法樹(AST)。考慮到函數的名稱,使用匹配的名稱搜索AST函數相當容易。如果你有超載的功能,你最終會得到不止一個命中;您可能會根據嵌入的層次結構或關於您可能具有的參數的信息來限定函數。在AST中確定了一個特定功能後,可以要求DMS漂亮地打印該樹,並且它將重新生成該功能的文本(包含註釋)。

+0

+1,很好的答案和指向PLSQL解析器的指針。 – DCookie 2010-07-09 15:55:01