繁体   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