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