2017-02-20 37 views
2

我有過表的視圖。事實證明,表格每天晚上都會移動並更新其版本。這確保了數據庫中始終存在預期名稱的表格,但我無法找到一種方法使我的視圖繼續指向表格的當前版本。無論創建視圖時存在哪個表格,我最終都會指出這個表格,即使它移動並過時。延遲表名稱解析查看

ViewA:

select a, b, c from todays_table; 

todays_table保持最新一整天,然後在晚上它被重命名爲todays_table01。視圖A現在指向todays_table01,並且新表格顯示爲todays_table。再次,todays_table是最新的,但不再是ViewA

是否有延遲表名稱解析直到視圖中使用的方法嗎?我一直無法獲得EXECUTE IMMEDIATESELECT聲明工作。我想如果我使用了一個遊標,我可以得到一個動態的SQL語句,但我從來沒有需要這些,我不知道它們是否是正確的路徑。我讀了AUTO_REVAL,但我相信這隻會延遲解決方案,直到第一次使用該視圖並且當晚仍然過時。

我當然可以,請停止使用視圖,只要將複雜的查詢到我的程序,但也有它需要的,所以我想落回在此之前消除所有其他解決方案的許多地方。

這將是理想的消除臨時表,只是有主表全天接收更新,但是這是我無法理解,因爲我什麼都不知道RPG II和OCL。

感謝您的閱讀。

編輯 Per @Mr。 Llama的建議,我嘗試使用同義詞和別名指向todays_table,然後讓我的觀點指向同義詞。不幸的是在這種情況下,視圖使用別名來解決在創建實際的表名這樣的觀點繼續當它被重命名爲todays_table01,雖然別名繼續引用todays_table指向todays_table

編輯2 我接受@ mustaccio的答案,因爲它的工作和將是一個合理的辦法解決這個問題,如果我能得到持續的參數,他們需要的地方。我特別的項目需要靈活性,所以我實際上會跳上夜間流程的潮流,並添加一個程序來重新創建我的意見後,過程混亂,他們的引用作爲@ danny117建議。

謝謝大家誰回答說,雖然,我學到了很多關於如何將所有這些作品一起工作。

+1

聽起來像是一個同義詞的工作。將觀點指向同義詞,然後更新同義詞以指向當前「活動」表。 –

+1

進入創建新日常表的過程,並在那裏創建視圖。 – danny117

+1

每次使用前創建並替換視圖。 – danny117

回答

2

我想你也許可以通過在SQL表函數包裝您的視圖定義,以達到你想要的東西,像

CREATE FUNCTION insteadofview (<parameters>) 
RETURNS TABLE (<columns>) 
... 
RETURN 
    SELECT <the rest of your view definition> 

取決於你如何查詢您的看法,您可能需要通過搜索條件轉換爲函數作爲參數,否則性能將不理想,因爲函數必須在應用搜索參數之前返回查詢中的所有行。

According to the manual,因爲您已經注意到已重命名的表上的視圖繼續指向原始表對象。但是,包括表函數在內的例程將失效,並且他們的計劃在下次調用時再次準備好,使用原始源表名稱

我沒有辦法測試這個。

Full syntax to create a table function

+1

謝謝你的回答。這確實有用!我甚至可以爲UDTF製作一個視圖,以便用戶不必關心細節。如你所說,缺點是性能。當我將視圖更改爲指向UDTF的外殼時,我的查詢大約需要14秒。在不涉及UDTF的情況下,查詢優化器在查詢優化器啓用時,相同的查詢需要前5秒,然後在隨後的執行中執行2.9。查詢優化器似乎不知道如何處理UDTF(可以理解)。如果我按照建議向UDTF添加參數,性能會更好,我相信。 –