insert all 遇到 sequence

简介: 当insert all 遇到 sequence 这几天在修改商函2.0中相关的PL/SQL包代码时,在实现这样一个SQL时:insert all into bo(object_name,sn) values(object_name,seqkey)                into...
当insert all 遇到 sequence
这几天在修改商函2.0中相关的PL/SQL包代码时,在实现这样一个 SQL 时:
insert all into bo(object_name,sn) values(object_name,seqkey)
                into co(object_name,sn)  values(object_name,seqkey)
select object_name ,sq1.nextval from ao

ORACLE ORA-02287 错,原因是 INSERT ALL 需要插入多表,但 SELECT 部分的 SEQUENCE 不允许一次 SELECT 多值,解决方案有两个:
方法一:编一个函数,将获取 sq1.nextval 的过程写在函数中,再在 select 部分引用函数,如下:
create or replace function f_getseqkey return number is
result number;
begin
select sq1.nextval into result from dual ;
return result ;
end;

SQL: insert all into bo(object_name,sn) values(object_name,seqkey)
                        into co(object_name,sn) values(object_name,seqkey-1)
select object_name ,f_getseqkey() seqkey from ao;

说明:这里有个 -1 的行为,研究发现,在插入多表时,实际上后面的 SELECT 是有做两次 NEXTVAL 行为的,而为了确保两个 INTO 插入同样的序列值,则人为进行 -1 插作,这个方案的后果是会多用序列值,在插入更多表的情况下,可能造成应用键值紧张,另外额外调用函数,性能也会下降。
方法二:
SQL insert all into bo(object_name,sn) values(object_name,sq1.nextval)
                          into co(object_name,sn) values(object_name,sq1.nextval)
          select object_name from ao

这个方法最好,无需定义函数,也不多用序列,性能也好,
现象:在两个 INTO 中都使用了 NEXTVAL ,但能确保是相同的值吗?答案是 OK ,因为 INSERT ALL 到多表,在 ORACLE 看来是同一 SQL ,即类同: SELECT SEQ.NEXTVAL,SEQ.NEXTVAL FROM DUAL 这样的 SQL ,同一 SQL 中多次调用同一序列,值相同。但如果在同一 SQL 中多次调用这个自定义函数,则会获得不同的值。
目录
相关文章
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
396 1
|
前端开发 API 数据库
面试官问:如何防止重复提交请求,99%的前端能说出来!
如何防止接口重复提交是一个常见的系统设计问题,主要目的是确保关键操作的原子性和一致性。以下是简化的摘要: 这些方法可以单独或组合使用,取决于系统规模和业务需求。例如,对于低流量系统,简单的请求唯一ID和数据库唯一索引可能足够;而对于高并发场景,可能需要结合前端禁用和后端分布式锁来提高可靠性。幂等性设计是确保接口安全的一种通用策略,适用于各种场景。
|
存储 Unix Shell
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
1436 0
|
自然语言处理 前端开发 计算机视觉
sula入门教程
本文适合有react、antd基础的小伙伴阅读
sula入门教程
【自媒体直播】手机摄像电脑控制OBS多平台推流解决方案
【自媒体直播】手机摄像电脑控制OBS多平台推流解决方案
683 0
|
Web App开发 缓存 网络协议
「Web应用架构」WebSocket 协议介绍
「Web应用架构」WebSocket 协议介绍
|
SQL Oracle 关系型数据库
|
小程序
支付宝小程序运动步数能力全面开放
支付宝小程序正式开放“运动数据”接口,该能力已上架支付宝能力中心小程序(打开支付宝,搜索能力中心可查看),所有“企业主体”小程序无需开发就可免费接入该功能。
2106 0
支付宝小程序运动步数能力全面开放