实际应用程序开发过程中,大部分业务表是由程序进行增删改,为避免冲突通常会配置序列表来配置序列生成规则。也部分表由运维人员进行配置,如系统控制参数等配置,程序不直接做增删改;
如果当前需求需要新增新的控制参数,由开发人员提供脚本,运维执行;
通常在插入数据时,主键的生成,通常采用的是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