2011-09-26 60 views
0

我構建一個相當大的Oracle 10g封裝的全功能等10克封裝結構 - 限制參考

問題是其中的一些功能從materilized視圖的表或其它功能正在創建中提取信息。

即使某些功能找不到他們正在尋找的信息,是否有成功編譯包的方法(但是這些功能在視圖創建完成後才能工作?)。

嘗試次數: 我查看了PRAGMA RESTRICT_REFERENCES,但至今沒有成功。我是否在正確的軌道上,或者這甚至不可能?

回答

4

不能將靜態SQL引用到編譯代碼時不存在的對象。對此你無能爲力。

您需要修改代碼以使用動態SQL來引用在運行時創建的任何對象。你也許可以使用EXECUTE IMMEDIATE,即

EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM new_mv_name' 
    INTO l_cnt; 

而不是

SELECT COUNT(*) 
    INTO l_cnt 
    FROM new_mv_name; 

話雖這麼說,但我會有關涉及創建任何新表和物化視圖的PL/SQL實現非常可疑運行。這在Oracle中幾乎總是一個錯誤。爲什麼你需要在運行時創建新對象?

+0

某些函數調用物化視圖來獲取信息。那麼我可以直接使用execute來創建這些視圖嗎? – sealz

+1

@ harper89 - 您需要使用動態SQL(很可能是'EXECUTE IMMEDIATE')來發出任何需要發佈的DDL,包括'CREATE VIEW'或'CREATE MATERIALIZED VIEW'調用。每次在代碼中引用這些對象時,您還需要使用動態SQL(再次,最有可能是'EXECUTE IMMEDIATE')。這將編譯檢查推遲到運行時,儘管它確實會使您的代碼更難編寫和調試。 –

+0

@ harper89:你似乎誤解了物化視圖的本質。它們被設計爲一次創建,然後根據需要刷新。 – Allan