簡體   English   中英

Oracle:單個列的 2 個列名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM