继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

通过存储函数获取序列

米脂
关注TA
已关注
手记 492
粉丝 88
获赞 590

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

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

通常在插入数据时,主键的生成,通常采用的是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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP