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
相关产品推荐
相关产品推荐

