尽管列和值匹配,Oracle 给我错误 ORA-00947

Posted

技术标签:

【中文标题】尽管列和值匹配,Oracle 给我错误 ORA-00947【英文标题】:Although columns and values match, Oracle gives me error ORA-00947 【发布时间】:2017-02-15 11:15:18 【问题描述】:

我想在更新之前保存日志表我的数据库数据。此外,对于日志记录,我想保存更新日期和时间。但是 oracle 给了我“ORA-00947:没有足够的值”错误。

我在 Google 上搜索了该错误,但所有答案都提到值和列的数量不匹配大小写。就我而言,它们匹配。 我哪里错了?

    INSERT INTO db.eee_log (process_date, process_time, id, name, type)
      VALUES(trunc(sysdate),
             TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'),
             (select p.id, p.name, p.type
                from db.eee p
               where id = 22
                 and name = 'xxx'
                 and type = 'xx'));

【问题讨论】:

您不能使用一个 select 语句为 insert 语句中指定的多个列提供值,就像您使用它的方式一样。您需要决定是仅使用 values() 子句还是仅使用 select 语句重写您的查询。 为什么将日期和时间存储在不同的列中?您似乎还插入了您要过滤的相同值,所以您实际上是否需要点击eee 表,或者您可以直接插入过滤器值吗? 【参考方案1】:

值的数量与列的数量不匹配。您在 values 子句中执行的子查询被视为单列表达式,而不是您期望的三个。要使用这样的子查询,它必须返回单个值,该值将进入单个列。

您可以从源表中生成所有值,而根本不使用子查询或值子句:

INSERT INTO db.eee_log (process_date, process_time, id, name, type)
SELECT trunc(sysdate),TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'),p.id, p.name, p.type
from db.eee p
where p.id = 22
and p.name = 'xxx'
and p.type = 'xx';

您的示例可能过于简化,但如果您确实在这样做,并且您提供的值在 eee 中始终只有一行,您可以直接在取而代之的是价值子句:

INSERT INTO db.eee_log (process_date, process_time, id, name, type)
VALUES (trunc(sysdate),TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), 22, 'xxx', 'xx');

【讨论】:

【参考方案2】:

你可以试试这样的:

  INSERT INTO db.eee_log (process_date, process_time, id, name, type)
     select
        trunc(sysdate),
        TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'),
        p.id,
        p.name, 
        p.type
     from db.eee p
     where id = 22
     and name = 'xxx'
     and type = 'xx'

【讨论】:

【参考方案3】:
INSERT INTO db.eee_log  (process_date, process_time, id, name, type)
SELECT trunc(sysdate), TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5'), p.id, p.name, p.type from db.eee p
            where id = 22
            and name = 'xxx'
            and type = 'xx'

【讨论】:

以上是关于尽管列和值匹配,Oracle 给我错误 ORA-00947的主要内容,如果未能解决你的问题,请参考以下文章

Navicat:连接Oracle时,提示ORA-28547,Cannot load OCI DLL.193,ORA-03135错误

Navicat:连接Oracle时,提示ORA-28547,Cannot load OCI DLL.193,ORA-03135错误

sql中的数组列和值

根据列和值在dataGridView中查找一行

ORA-0 [BEA][Oracle JDBC Driver] 未处理的 sql 类型

如何使用分隔列和值的数组生成查询