2010-09-08 61 views
1

我想知道是否有可能創建一個視圖,自動檢查是否有新的每月創建的表,如果有包含那個?我可以創建自動檢查新的每月表的Oracle視圖嗎?

我們有一個新的表按月份創建,每一個與月份的數字結尾,像

table for January: table_1 
table for February: table_2 
etc... 

是否有可能創建一個視圖,所有這些表中獲取數據,並發現當有是一個新的創建?

+2

「我們每個月都創建一個新表」 - 不要。如果您需要每月組織數據,請添加一個「月」列。 – MSalters 2010-09-08 11:59:15

+1

我很好奇:下個月會發生什麼? – 2010-09-08 12:28:33

+0

由於不是「我的」程序,我們不允許在不失去支持的情況下改變它的工作方式,所以我無法做到這一點。如果我能的話,我可能會按照Michael Pakhantsov的建議進行劃分。它只會保留一年的記錄,所以明年1月它只會替換舊的_1表。 – Balroq 2010-09-08 19:26:16

回答

4

不,視圖的定義是靜態的。您將不得不每月用包含新表格的新副本替換視圖;你可以寫一個動態的PL/SQL程序來做到這一點。或者您現在可以創建所有空表並將它們全部包含在視圖定義中;如果有必要,您可以推遲授予對未來表的任何INSERT訪問權限,直到它們變爲「實時」。

但是真的,這個模型是有缺陷的 - 請參閱Michael Pakhantsov的更好選擇的答案 - 或者只是一個帶有MONTH列的簡單表格。

+0

猜猜我必須安排一個PL/SQL程序來重新創建每個月的視圖... – Balroq 2010-09-08 19:28:41

4

如果您不是每月創建新表格,都會爲現有表格創建新分區,這將成爲可能。

UPDATE:

如果你有甲骨文SE不分區選項,您可以創建兩個表:實況表和ArchiveTable。然後每個月你需要將行從Live移動到ArchiveTable並清理活動表。在這種情況下,您只需從兩個表創建視圖。

+2

+1「每月一桌」的想法聽起來很有缺陷。 – 2010-09-08 11:45:27

0

另一種選擇是在另一個架構中創建表格,並向相關用戶提供授權併爲其創建公共同義詞。

由於月度表在本地模式中創建,它們將「優先於」公共同義詞,並且視圖會選擇它們。它仍然會失效並需要重新編譯,但實際的視圖文本應該需要更改,從代碼控制的角度來看可能更簡單。

0

您可以編寫一個程序或函數,查看USER_TABLESALL_TABLES以確定表是否存在,生成動態sql並返回帶有數據的引用遊標。流水線功能也可以做到這一點。

相關問題