【问题标题】:Direct-Path INSERT query generates ORA-00918 errorDirect-Path INSERT 查询生成 ORA-00918 错误
【发布时间】:2017-10-24 22:27:55
【问题描述】:

您能否解释一下为什么在执行此查询时会生成错误 ORA-00918

INSERT INTO CLG_TEST_2 (CLG_TEST_2.record_id, CLG_TEST_2.chain_id, 

CLG_TEST_2.chain_n, 
CLG_TEST_2.contact_info)

select * from (

SELECT 1, 1, 0, '2222' from dual UNION ALL

SELECT 2, 2, 0, '4444' from dual UNION ALL

SELECT 3, 3, 0, '6666' from dual

)

第 1 行出错 ORA-00918: 列定义不明确

脚本在第 2 行终止。

【问题讨论】:

    标签: oracle ora-00918 direct-path


    【解决方案1】:

    问题在于您在查询上使用select * 而没有为列提供别名;这将起作用:

    INSERT INTO CLG_TEST_2 (CLG_TEST_2.record_id,
                            CLG_TEST_2.chain_id,
                            CLG_TEST_2.chain_n,
                            CLG_TEST_2.contact_info)
    select *
    from (
            SELECT 1 a, 1 b, 0 c, '2222' d from dual UNION ALL
            SELECT 2  , 2  , 0  , '4444'   from dual UNION ALL
            SELECT 3  , 3  , 0  , '6666'   from dual
         )
    

    但是,您可以简化代码:

    INSERT INTO CLG_TEST_2 (record_id, chain_id, chain_n, contact_info)
        SELECT 1, 1, 0, '2222' from dual UNION ALL
        SELECT 2, 2, 0, '4444' from dual UNION ALL
        SELECT 3, 3, 0, '6666' from dual
    

    关于错误原因的更多信息。

    您的代码:

    SQL> INSERT INTO CLG_TEST_2 (
      2      CLG_TEST_2.record_id,
      3      CLG_TEST_2.chain_id,
      4      CLG_TEST_2.chain_n,
      5      CLG_TEST_2.contact_info)
      6  select * from (
      7      SELECT 1, 1, 0, '2222' from dual UNION ALL
      8      SELECT 2, 2, 0, '4444' from dual UNION ALL
      9      SELECT 3, 3, 0, '6666' from dual
     10  );
    select * from (
           *
    ERROR at line 6:
    ORA-00918: column ambiguously defined
    

    略有不同:

    SQL> INSERT INTO CLG_TEST_2 (
      2      CLG_TEST_2.record_id,
      3      CLG_TEST_2.chain_id,
      4      CLG_TEST_2.chain_n,
      5      CLG_TEST_2.contact_info)
      6  select * from (
      7      SELECT 1, 2, 0, '2222' from dual UNION ALL
      8      SELECT 2, 2, 0, '4444' from dual UNION ALL
      9      SELECT 3, 3, 0, '6666' from dual
     10  );
    
    3 rows created.
    

    有什么不同?

    在第一行,我改变了

    SELECT 1, 1, 0, '2222' --> SELECT 1, 2, 0, '2222'
              ^                          ^
    

    原因:

    SQL> SELECT 1, 2, 0, '2222' from dual UNION ALL
      2  SELECT 2, 2, 0, '4444' from dual UNION ALL
      3  SELECT 3, 3, 0, '6666' from dual;
    
             1          2          0 '222
    ---------- ---------- ---------- ----
             1          2          0 2222
             2          2          0 4444
             3          3          0 6666
    
    SQL> SELECT 1, 1, 0, '2222' from dual UNION ALL
      2  SELECT 2, 2, 0, '4444' from dual UNION ALL
      3  SELECT 3, 3, 0, '6666' from dual;
    
             1          1          0 '222
    ---------- ---------- ---------- ----
             1          1          0 2222
             2          2          0 4444
             3          3          0 6666
    
    SQL>
    

    这里有两列具有相同的别名'1',这对于外部select * 来说是令人困惑的。

    另外,direct-path insert 也有所不同

    【讨论】:

      【解决方案2】:

      我没有看到任何“直接路径”插入。不管怎样,试试这个

      INSERT INTO CLG_TEST_2 (CLG_TEST_2.record_id, CLG_TEST_2.chain_id,     
         CLG_TEST_2.chain_n, 
         CLG_TEST_2.contact_info)    
      SELECT 1, 1, 0, '2222' from dual UNION ALL
      SELECT 2, 2, 0, '4444' from dual UNION ALL
      SELECT 3, 3, 0, '6666' from dual
      

      顺便说一句,你为什么使用数字中的字符串?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多