2009-10-02 69 views
0

我在一個文件夾中有很多存儲過程和函數。我有一個批處理文件,它可以遍歷文件夾中的.sql文件,並將文件名寫入單個SQL文件以供執行。之後,批處理文件將執行SQLPlus中的單個文件。我遇到的問題是創建存儲過程和函數的順序。我得到編譯錯誤,因爲存儲過程C需要函數A來執行,但是存儲過程C是在函數A之前創建的。有沒有辦法繞過這個,而沒有命令存儲過程和函數呢?我的假設是沒有,但我想在開始訂購腳本之前確定。Oracle存儲過程/函數加載順序

回答

5

你可以加載,然後他們走過的依賴查看,試圖制定出下一次正確的順序,或者只是加載它們,然後重新編譯,但實際上工作的最好方法是使用包,而不是獨立的過程和函數。

在這種情況下,您將首先創建所有包規範,然後創建包體。正是出於這個原因,他們被分爲規格和正文。

+3

+1用於使用軟件包 – APC 2009-10-02 13:19:36

+0

我可以將執行授予程序包中的單個程序和函數,還是必須授予整個程序包執行不同角色的執行權限? – 2009-10-02 14:37:10

+0

GRANT的單位是對象,所以它會是包裝 – APC 2009-10-02 15:58:33

0

只需創建對象(一些將無效)並在隨後的步驟中將它們全部編譯。

[編輯]

我剛纔看到大衛的回答後,我張貼和他有關轉換的程序和函數到包的建議是一個很好的,但是如果以後添加其他對象到該文件夾​​,如視圖,類型,等等,你仍然有依賴問題。我使用嵌套循環進行重新編譯 - 內部循環選擇所有無效的對象並重新編譯。這是一個外循環時,不存在無效的對象或達到某個最大值通值(那些你有需要修正的實際編譯錯誤的情況下)

+0

不要忽視用於創建視圖的FORCE語法 – 2009-10-02 13:34:25

+0

@David - 好點 - 我們一直在努力讓人們用「CREATE或REPLACE FORCE VIEW ...「,以避免破壞構建。 – dpbradley 2009-10-02 13:39:08

1

編譯錯誤也許並不重要,那退出的內。您第一次調用其中一個無效的過程時,它會進行編譯。

問題是「破窗」綜合徵,即真正的缺失依賴性在所有的噪音中喪失。如果這個想法困擾你,你可以編譯所有失效的程序單元。有多種方法可以做到這一點,但最好的方法是使用the UTL_RECOMP package(10g或更高版本)或使用utlrp.sql腳本,在早期版本中可以找到%ORACLE_HOME%/rdbms/admin

更新

所羅門Yakobson寫了一個PL/SQL程序重新編譯無效程序;它不依賴於版本,不需要SYSDBA權限。 Download it.

+2

您必須擁有SYSDBA權限才能使用這些選項。 – dpbradley 2009-10-02 13:41:27

0

你可以提高在某種程度上你的批處理文件,它評估的相關性信息,您可以存儲爲特殊的註釋在SQL文件或也許在你的版本控制系統作爲標記或一般性意見的一部分。

如果您遇到依賴性問題導致的錯誤,那麼在執行生成的sql腳本時,您知道已經引入了一些新的依賴關係,需要對其進行「描述」以供批處理識別它。

是的,這將是手動工作。但是安裝的sql腳本仍然會生成,就像現在一樣。

0

我們這樣做的方式是創建所有的存儲過程,然後嘗試編譯它們5次。如果仍有一些存儲過程在5次後仍無法編譯,則會導致構建失敗。根據我的經驗和我們的代碼庫,已證明5次重複已足夠。