【问题标题】:Invalid column ORA- 00904 error while inserting into table from view从视图插入表时出现无效列 ORA-00904 错误
【发布时间】:2019-07-03 07:49:52
【问题描述】:

在我的主表中,表结构列不带双引号,但在视图列中带双引号。将视图中的数据插入表中时出现错误。 这是tbl

的表结构
create table tbl (ID number(10),
                  name varchar2(50),
                  addr varchar2(200));

虽然视图是-

 create or replace view t_view as
 select "ID", "name", "addr"  from tbl;

t_viewtbl 插入数据时 -

insert into tbl
select * from t_view;

然后得到错误ORA- 00904: "addr": Invalid identifier

那么如何解决这个问题,我可以从创建视图中删除双引号吗?

【问题讨论】:

标签: oracle plsql view


【解决方案1】:

从代码中的任何位置删除所有双引号。

如果您在创建对象时使用它们,则必须始终使用它们,并指定完全相同的字母大小写。

摆脱这些,Oracle 默认情况下不区分大小写并将所有名称视为大写(但您可以以任何方式引用它们,只是不要使用双引号!)。

【讨论】:

    【解决方案2】:

    默认情况下,Oracle 以 大写 存储任何对象的名称。如果您提供了双引号,那么只有 Oracle 会按原样存储对象的名称。

    • 双引号 - 区分大小写
    • 无引号 - 不区分大小写 - 以大写形式存储名称

    在您的情况下,在编写表的 DDL 时,您没有在双引号中提供列名,因此您的表名和列名以大写形式存储在元数据中。

    您可以使用以下查询看到相同的结果

    select table_name, column_name from user_tab_columns where table_name = 'TBL';
    

    为了给出答案,请使用以下任一语法创建视图:

    create or replace view t_view as
     select ID, name, addr  from tbl; -- no double quotes
    
    create or replace view t_view as
     select "ID", "NAME", "ADDR"  from tbl; -- UPPERCASE column names in double quotes
    

    查看演示here

    干杯!!

    【讨论】:

      【解决方案3】:

      你想要完成什么。你的要求是没有意义的。您的预期陈述

      insert into tbl select * from t_view;
      

      完成与

      完全相同的事情
      insert into tbl select * from tbl;
      

      并不是说你不能这样做(你可以),但它只会导致大量重复数据问题或(希望)违反唯一约束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 2012-10-30
        • 1970-01-01
        • 2022-01-15
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多