oracle顺序号⽣成函数。仿Sequence
问题提出⾃项⽬中的⽼代码:⼀个Bill表,存储所有的表单信息,⽐如:员⼯⼊职单,离职单等等。(别喷,我知道要分多个表。但领导的意愿你是没办法违背的)表单的单据号是以四个字母+年⽉⽇+数字顺序号来表⽰。每次取新单据号时要从Bill表⾥(按⽣成规则)查询出最⼤的那个单据号,再拆分出来,再给顺序号加1,组合好后再写回。哈哈这就是⽼代码。
随着软件⾏业的进步,各种技巧层出不穷。⽽针对顺序号⽣成的⽅法也有好巨⼤改进。
这⾥其中的⼀篇。看过这个之后就想⾃⼰动⼿也写⼀个。于是:
顺序号表
--id序列表
create table SEQUENCES
(
id          VARCHAR2(20) not NULL PRIMARY KEY,--标识
minvalue    NUMBER default1,--最⼩值
maxvalue    NUMBER default9999999999999999999999999999,--最⼤值
currentvalue NUMBER DEFAULT1,--当前值
increaseby  NUMBER default1,--增量
CYCLE        CHAR(1) default'0'--是否循环
)
⽣成函数
--获取 select NextValue('abc') from dual;
create or replace function NextValue(arg varchar2) return number IS
PRAGMA AUTONOMOUS_TRANSACTION;
Result number;
x NUMBER;
a NUMBER;
i NUMBER;
c Char(1);
BEGIN
IF TRIM(arg) IS NULL THEN--防⽌值⼊空字符串
RAISE_Application_Error(-6502,'param "arg" is not valide.',TRUE);
字符串函数注册登录END IF;
<<top>>
SELECT COUNT(1) INTO x FROM Sequences WHERE ID = arg;
IF x =0THEN
BEGIN
BEGIN
INSERT INTO Sequences (ID) VALUES(arg);--防⽌并发同时插⼊相同的Id值。需要将id设为主键
EXCEPTION
WHEN OTHERS THEN
GOTO top;
END;
COMMIT;
RETURN1;
END;
ELSE
BEGIN
SELECT s.currentvalue + s.increaseby,s.maxvalue,s.le INTO Result,a,i,c FROM  Sequences s WHERE ID = arg FOR update;--for update将锁定此⾏记录IF RESULT < a THEN--未超出最⼤值
BEGIN
UPDATE Sequences SET currentvalue = Result WHERE ID = arg;
COMMIT;
return(Result);
END;
ELSE
BEGIN
IF c ='0'THEN--不循环
BEGIN
RAISE_Application_Error(-6502,'out of range.',TRUE);
END;
ELSE
BEGIN--循环
UPDATE Sequences SET currentvalue = i WHERE ID = arg;
COMMIT;
RETURN i;
END;
END IF;
END;
END IF;
END;
END IF;
END;
是的,我使⽤了参数。这样就使得这个表更加有⽤,⽽⾮只单独处理⼀种类型顺序号。同时对并发进⾏了处理。让你只可能取得⼀个值,⽽不会出现重复的值。当然所有的result都没有进⾏格式化,⽽是直接输出。在PLSQL中进⾏函数test,打开两个窗⼝,单步调试,可以看到在insert 或select for update时都会阻塞其它session对此表的操作。这样可以使⽤result的结果唯⼀。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。