0
我構建一個相當大的Oracle 10g封裝的全功能等10克封裝結構 - 限制參考
問題是其中的一些功能從materilized視圖的表或其它功能正在創建中提取信息。
即使某些功能找不到他們正在尋找的信息,是否有成功編譯包的方法(但是這些功能在視圖創建完成後才能工作?)。
嘗試次數: 我查看了PRAGMA RESTRICT_REFERENCES
,但至今沒有成功。我是否在正確的軌道上,或者這甚至不可能?
我構建一個相當大的Oracle 10g封裝的全功能等10克封裝結構 - 限制參考
問題是其中的一些功能從materilized視圖的表或其它功能正在創建中提取信息。
即使某些功能找不到他們正在尋找的信息,是否有成功編譯包的方法(但是這些功能在視圖創建完成後才能工作?)。
嘗試次數: 我查看了PRAGMA RESTRICT_REFERENCES
,但至今沒有成功。我是否在正確的軌道上,或者這甚至不可能?
不能將靜態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中幾乎總是一個錯誤。爲什麼你需要在運行時創建新對象?
某些函數調用物化視圖來獲取信息。那麼我可以直接使用execute來創建這些視圖嗎? – sealz
@ harper89 - 您需要使用動態SQL(很可能是'EXECUTE IMMEDIATE')來發出任何需要發佈的DDL,包括'CREATE VIEW'或'CREATE MATERIALIZED VIEW'調用。每次在代碼中引用這些對象時,您還需要使用動態SQL(再次,最有可能是'EXECUTE IMMEDIATE')。這將編譯檢查推遲到運行時,儘管它確實會使您的代碼更難編寫和調試。 –
@ harper89:你似乎誤解了物化視圖的本質。它們被設計爲一次創建,然後根據需要刷新。 – Allan