【问题标题】:Oracle persistent column aliasOracle 持久列别名
【发布时间】:2017-10-18 17:27:57
【问题描述】:

我是 Oracle 最终用户,而不是数据库开发人员或管理员。

我们的数据库在列名中有一些拼写错误,类似于将列命名为 ADRESS2 而不是 ADDRESS2

我必须在查询中使用这些列,而且很难记住哪个错字适用于哪个列。另外,我对这使我的代码看起来的方式有点 anal 小气(不那么专业)。

我怀疑没有机会在生产环境中真正重命名这些列——这将是一个低优先级,具有很多依赖项。

在这种情况下,最佳做法是什么?

我能想到几个选项:

  • 添加拼写错误的 cmets
  • select(bad_name good_name, * from table) 包裹表格
  • 根据上述创建视图

但是有没有办法做类似的事情:

DECLARE address2 CHAR(8) := 'adress2';    

并在查询中使用,但返回 ADRESS2 的值而不是字符“adress2”。

理想的解决方案是:

  • 不会增加查询的复杂性
  • 将被开发人员识别为对列名难以处理或具有误导性的情况的响应

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    我认为唯一合法的回应是观点。如果我遇到你的情况,我会修正列错字。如果做不到这一点,我会创建一个视图。

    但是,你的问题让我觉得你愿意考虑更多“外面”的东西,所以这里是:

    alter table sample_table add address2 
        invisible generated always as ( addres2 || '') virtual;
    

    这很可能不会影响您的任何应用程序,因为除非他们明确要求,否则不会看到 ADDRESS2 列。

    但是,它使您可以使用它。

    请记住,函数ADDRES2 || '' 意味着您的查询不会使用您以这种方式访问​​的列的索引。

    重复:我会更改列名或创建视图。

    【讨论】:

    • 向 OP 道歉——我看到你在 11g 上。没有适合您的 INVISIBLE 列(这是 12c 功能)。
    • 不需要它是不可见的。您可以将其命名为 alter table sample_table add address2 generated always as ( addres2 || '') virtual; - 这将适用于 11g 第 1 版。
    • 没错,但将其设为INVISIBLE 会显着降低破坏现有系统的风险。如果该列不是INVISIBLE,则任何通过SELECT * 访问列的代码(不好的做法,但确实会发生)也将包含新列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多