[英]Oracle : 2 column names for a single column
需要重命名數據庫表和列名稱,因此所有從源獲取數據的工具/應用程序都必須更改它們的查詢。 我們計划實施的解決方案是,對於每個表名更改,我們將使用原始表名創建一個 VIEW。 易於實施。 不需要更改查詢,但在某些情況下,表名保持不變,但表內的列名發生變化,因此我們無法創建另一個視圖(具有相同對象名的任何對象)。
有沒有我們可以在這里提出的列同義詞? 歡迎任何解決方案/想法。 要求是查詢包含引用相同表中新列的原始列名。
例如:
Table Name: DATA_TABLE
Existing Column Name: PM_DATE_TIME
New Column Name: PM_DATETIME
Existing Query select pm_Date_time from Data_Table;
應參考新列pm_Datetime
您可以考慮重命名原始表,然后在其位置創建一個視圖,提供舊列名和新列名:
CREATE TABLE Data_Table ( pm_Date_time DATE );
ALTER TABLE Data_Table RENAME TO Data_Table_;
CREATE VIEW Data_Table AS
(
SELECT pm_Date_time,
pm_Date_time AS pm_Datetime -- Alias to provide the new column name
FROM Data_table_
);
-- You can use both the old columnn-name...
INSERT INTO Data_Table( pm_Date_time ) VALUES ( SYSDATE );
-- ... or the new one
UPDATE Data_Table SET pm_Datetime = SYSDATE;
有些事情不會像以前一樣工作:
-- INSERT without stating column-names will fail.
INSERT INTO Data_Table VALUES ( SYSDATE );
-- SELECT * will return both columns (should not do this anyway)
SELECT * FROM Data_Table
完成更改后,刪除視圖並重命名表和列。
您需要添加虛擬列:
ALTER TABLE Data_Table ADD pm_Date_time as (pm_Datetime);
更新: Oracle(至少 11g)不接受這一點並引發“ORA-54016:指定了無效的列表達式”。 請使用 Peter Lang 的解決方案,他在其中偽添加了零天:
ALTER TABLE Data_Table ADD (pm_Datetime + 0) AS pm_Date_time;
這就像一個視圖; 訪問pm_Date_time
您實際上是在訪問pm_Datetime
。
Reextester 演示: http ://rextester.com/NPWFEW17776
Peter 在這一點上也是正確的,您可以在查詢中使用它,但不能在 INSERT/columns 或 UPDATE/SET 子句中使用它。
這基本上在 Thorsten Kettner 的回答中有所涉及,但是您要尋找的是偽列。
這個解決方案看起來有點老套,因為偽列的語法需要一個表達式。 我能想到的最簡單的表達方式是下面的 case 語句。 如果你能讓它更簡單,請告訴我。
ALTER TABLE <<tablename>> ADD (
<<new_column_name>> AS (
CASE
WHEN 1=1 THEN <<tablename>>.<<old_column_name>>
END)
);
該策略基本上通過評估 case 語句並將<old_column_name>
的值復制到<old_column_name>
來<new_column_name>
創建一個新列。 因為您正在動態插入此列,所以與僅選擇原始列相比,性能會有所下降。
這里的一個問題是,這僅在您復制一列時才有效。 Oracle 中的多個偽列不能包含重復的表達式。
我們不能創建另一個視圖(具有相同對象名稱的任何對象)。
在模式中確實如此。 另一種有點混亂的方法是創建一個具有適當權限的新用戶/模式,並在其中創建所有視圖,並在原始模式中查詢修改后的表。 如果您需要做的不僅僅是查詢,您可以包含替代觸發器。 他們只需要舊的列名(作為別名),而不是新的列名,所以不指定列的插入(當然這是不好的)仍然可以工作。
如果應用程序/工具調用 any 並且它們的規范沒有改變,您還可以在原始模式中創建包等的同義詞。 如果它們發生了變化,您可以在新模式中創建包裝器包。
然后,您的舊工具/應用程序可以連接到該新模式,如果一切設置正確,將會看到看起來像以前一樣的東西。 如果無法修改連接方式或連接到的帳戶,則可能通過設置current_schema
來完成,可能是通過登錄觸發器。
隨着工具和應用程序升級以使用新的表/列名稱,它們可以切換回原始模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.