为了账号安全,请及时绑定邮箱和手机立即绑定

通过存储函数获取序列

标签:
Oracle

实际应用程序开发过程中,大部分业务表是由程序进行增删改,为避免冲突通常会配置序列表来配置序列生成规则。也部分表由运维人员进行配置,如系统控制参数等配置,程序不直接做增删改;

如果当前需求需要新增新的控制参数,由开发人员提供脚本,运维执行;

通常在插入数据时,主键的生成,通常采用的是max(t.id)+1,可能会出现序列表的值小于数据表值情况,导致实际程序运行获取序列插入主键冲突的情况。

 

CREATE OR REPLACE FUNCTION F_SEQUENCE(i_busi_serial_name in VARCHAR2, i_num in NUMBER) return number is
V_CURRENT NUMBER(15);
PRAGMA AUTONOMOUS_TRANSACTION;
begin
begin
select A.SEQUENCE INTO V_CURRENT from CAREFX_TABLE_SEQ A WHERE A.TABLE_NAME = i_busi_serial_name for update;
exception
//当序列表(CAREFX_TABLE_SEQ)不存在该表序列数据时,插入序列记录;
when NO_DATA_FOUND THEN
INSERT INTO CAREFX_TABLE_SEQ(TABLE_NAME,SEQUENCE) values (i_busi_serial_name,1);
--查询出当前序列值
select A.SEQUENCE INTO V_CURRENT from CAREFX_TABLE_SEQ A WHERE A.TABLE_NAME = i_busi_serial_name for update;
END;
//将当前序列表对应序列值+1;
UPDATE CAREFX_TABLE_SEQ A SET A.SEQUENCE = A.SEQUENCE + DECODE(i_num,NULL,1,i_num) WHERE A.TABLE_NAME = i_busi_serial_name;
COMMIT;
//返回查询的序列值;
return(V_CURRENT);
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
return NULL;

end F_SEQUENCE_GEN;

CAREFX_TABLE_SEQ:序列表
存在序列表配置的业务表:
使用 select f_sequence_gen('BI',1) FROM DUAL,替换 SELECT max(t.id)+1 FROM bi t;
对于通过业务序列来进行数据手动插入的业务表,使用上述存储函数来获取序列值:

作者:临风想望

原文链接:https://www.cnblogs.com/xukai-blogs/p/10400047.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消