虽然列和值匹配,但Oracle给出了错误ORA-00947

时间:2017-02-15 11:15:18

标签: sql oracle

我希望在更新之前保存日志表我的数据库数据。另外,对于日志记录,我想保存更新日期和时间。但是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'));

3 个答案:

答案 0 :(得分:3)

值的数量与列数不匹配。您在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');

答案 1 :(得分: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'

答案 2 :(得分:0)

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'