2012-09-09 31 views
0

我有一個sql腳本文件,我用它來安裝表,觸發器,序列和最後一個包。該包使用由sql腳本文件創建的表。該程序包被指定爲在應用程序中發生事件時運行,即當應用程序觸發器被觸發時程序包運行。PLSQL - 安裝工作或者

所有的軟件包都會執行批量選擇插入到臨時表中。就是這樣。

現在,問題是當我第一次執行乾淨安裝時,程序包會被觸發並運行,但不會將數據插入到臨時表中。但是,當下一個事件發生時,包被觸發並且數據被插入到分段穩定器中並繼續正常工作。所以最初我認爲這可能是一個初始化錯誤。

但是,當我刪除包含該包的sql腳本文件創建的所有對象並重新運行sql腳本文件時,該包在第一個事件本身發生並繼續正常工作時工作得很好。

所以這不能是一個初始化錯誤。

但是,再次(因爲我失去了理智)我放棄了一切,重新運行腳本文件,我發現我第一次注意到同樣的行爲。然後我再次放下所有東西,並重新運行第一次運行的腳本文件。

我不知道爲什麼它可以交替工作,這太奇怪了。

回答

3

我猜測代碼處於無效(未編譯)狀態。在調用尚未創建的包的表上創建一個觸發器。然後創建包。第一次運行後,觸發器代碼由服務器自動重新編譯。在創建腳本中,創建所有對象後,運行腳本編譯無效對象(ALTER <object> COMPILE)。

確認這種情況下通過檢查:

SELECT object_type, object_name 
    FROM all_objects 
    WHERE status = 'INVALID' 

創建之後,但在此之前你的事件觸發。

+0

實際上表不調用包。第二件事是當我運行查詢INVALID對象時,它重新創建了0行。我嘗試使用sleep(),甚至將包的安裝從腳本文件中移出。但行爲重複。我打算手動安裝這個,看看我是否得到相同的行爲。 – user547453

+0

@Glenn ....這確實是一個潛在的同義詞,成爲無效evrytime我放棄了包。同義詞是爲包創建的。謝謝你指出我朝着正確的方向。但我認爲INVALID對象在手動編譯之前不會自動重新編譯。 – user547453

+1

@ user547453很高興你找到它。可以令人沮喪的發現。查看[關於對象相關性和對象失效](http://docs.oracle.com/cd/E11882_01/server.112/e25494/general007.htm#ADMIN12491)'當引用了無效的依賴對象時,將自動進行重新編譯.'當無效對象被命中時,嘗試重新編譯,但是命中無效對象的作業仍然失敗,因爲它無效。如果編譯成功,則下一個命中結束。再往下看一下'utl_recomp':在安裝腳本之後運行可能很有用。 – Glenn