You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL执行INSERT语句报ORA-00913值过多错误如何解决

错误原因

  • 触发ORA-00913的直接原因:你给data_mapp_info_regs字段赋值的子查询同时返回了MAX(data_mapp_info_regs)、CASE运算结果两个列,而单个值位置只能接收1个返回值,因此报错值数量不匹配。
  • 隐藏逻辑错误:原语句CASE data_mapp_info_regs WHEN NULL的写法不生效,Oracle中NULL不能用等值逻辑判断,该分支永远不会触发,无法实现空值时赋值1的需求。

修正方案

直接用NVL函数简化逻辑即可,既解决返回多列的问题,也完全符合你的业务需求:如果指定data_mapp_camp_id=77下没有记录,MAX(data_mapp_info_regs)结果为NULL,加1后仍为NULL,NVL会返回1;如果有记录则直接返回最大值+1。

修正后的完整SQL如下:

INSERT
INTO data_mapp_info
  (
    data_mapp_info_id,
    data_mapp_camp_id,
    data_mapp_info,
    data_mapp_info_regs,
    dt_first,
    dt_ult_modf,
    user_ult_modf
  )
  VALUES
  (
    (SELECT MAX(data_mapp_info_id)+1 AS data_mapp_info_id
      FROM MAPP.DATA_MAPP_INFO
    ),
    77,
    'Value 1',
    (SELECT NVL(MAX(data_mapp_info_regs)+1, 1)
    FROM MAPP_SOA.DATA_MAPP_info
    WHERE data_mapp_camp_id = 77
    ),
    sysdate,
    sysdate,
    'user.name'
  ) ;

可选优化提示

你当前用MAX(id)+1生成主键的方式在高并发场景下会出现主键重复的问题,生产环境建议使用Oracle序列(Sequence)生成唯一主键值。

内容的提问来源于stack exchange,提问作者nauanalima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 08:45:05