尽管列和值匹配,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错误