2014-01-23 25 views
3

我創建一個Oracle觀點是這樣的:如何在VIEW輸出子句中保留「*」,以便列跟蹤表的更改?

SELECT * FROM TABLE; 

當我創建視圖,我注意到,甲骨文改變視圖查詢是這樣的:

SELECT FIELD1, FIELD2,... FROM TABLE; 

我的問題是,如果我更改TABLE結構,例如添加一個新字段,在視圖中不考慮更改。然後,我需要重新創建視圖,並將這個視圖的權限重新分配給用戶/角色。

有沒有什麼辦法使視圖模式通用,並保持它的形式:SELECT * FROM TABLE?

謝謝。

+2

你應該能夠簡單地改變原來的定義視圖,不是?在SQL中,視圖具有「'*」「形狀的意義並不比表格沒有意義 - 列表通配符對於只想要一些輸出的懶惰人來說大多是一種破解,正確的,現在:) – user2864740

+0

這只是一個例子。這個想法是如何獲得當前表結構,無論發生什麼?假設它是:SELECT * FROM TABLE where ID = x。我想獲得表格的所有當前字段。 –

+0

如果視圖自動跟蹤列更改可能會導致應用程序代碼出現問題(如果它不具有類似的靈活性)。所以請記住,如果你找到了解決方案。 –

回答

6

你不能定義一個簡單的觀點,即會自動改變其結構,當底層表更改。當添加新列時,您需要觸摸視圖。您幾乎可以肯定需要按照@GordonLinoff的建議進行操作,並在表格更改時執行CREATE OR REPLACE。鑑於對錶格的更改應該很少,並且應該涉及適當的更改控制,因此觸摸視圖作爲更改的一部分應該是一個相對簡單的步驟。

如果你確實想避免碰觸視圖,還有一些選擇。我通常不會推薦這些,因爲它們很可能增加而不是降低維護系統的複雜性。但是如果你有一個第三方系統生成DDL以在不可預測的基礎上添加列,那麼這可能是有道理的。

您可以創建一個DDL觸發器,用於響應表ALTER中的語句觸發,並使用dbms_job重新創建視圖提交作業。這是相當多的移動部分,但它通常是可行的。

或者,您可以創建一個流水線表函數來返回可變數量的列,而不是視圖。這將是really complicated,但它也很漂亮。我覺得使用這種方法的地方並不多,因爲沒有太多的人可以查看代碼並有機會維護它。但代碼很漂亮。

6

*是在創建視圖時評估的,而不是在執行時評估的。實際上,Oracle編譯視圖以加快執行速度。它在引用視圖時使用編譯後的代碼。它不只是在查詢中進行文本替換。

改變視圖的正確的語法是:

create or replace view v_table as 
    select * 
    from table; 
+0

是否在Oracle中創建或替換保留權限等? (我認爲它在這裏幾乎總是一個替換操作。) – user2864740

+0

@ user2864740。 。 。是的,它確實。 –

+0

這是我的問題,我不想在創建後再觸碰視圖。視圖由以下定義:SELECT * FROM TABLE。是否有可能在桌面上保留「*」? –

0

我必須面對這個同樣的問題,創建了接受表的名稱,並創建視圖的過程:

str := 'create or replace view xyz.'|| tablename_in ||'_v as select * from '|| tablename_in; 

execute immediate str; 

然後在蟾蜍(不知道你是否使用蟾蜍),在架構瀏覽器,右鍵單擊表名稱,然後選擇「自定義查詢」 - >「編輯自定義查詢」,然後把它調用你的程序爲:

exec view_create<ObjectList> 

然後你可以右鍵單擊表名和一個點擊創建視圖,因爲Toad會將表名稱傳遞給過程。

另外,在過程中,您可能需要重新編譯的模式,所以在創建視圖後做:

sys.utl_recomp.recomp_parallel(4, 'XYZ'); 

如果你開發某種可自動半的腳本,它使事情變得簡單。

希望這有助於...