Oracle 中生成流水号的方法

思路:

通过一个流水号表,记录当前最大的流水号,以便下次取用。每次取号时,将流水号表更新成大的。

涉及的表:

  流水号表hp_no:  

字段 类型
type_name varchar2(100)
start_no varchar2(100)
current_no varchar2(100)

代码:

1)通过函数得到最大值。 有三个参数,

  第一个参数是类型,便于得到不同的流水号。

  第二个参数是前缀,用于在流水号前边放置特别的字符。

  第三个参数是生成的流水号长度。

代码

create or replace function hp_test_getno(
p_type_name in varchar2 default '', --类型 参数1
p_start_no in varchar2, --前缀 参数2
p_length in number --得到流水号长度 参数3
)
return varchar2 --返回类型
is
v_result varchar2 (100) := ''; --结果 变量1
v_current_no varchar2 (100) := ''; --当前值 变量2
v_num number := 0; --补值 变量3
v_start_no varchar2(100); --前缀 变量4
v_rowid varchar2 (100); --要更新行的rowid 变量4
begin
v_start_no :=p_start_no; --参数值赋给变量
select count (*)
into v_num
from hp_no
where type_name = p_type_name and start_no = p_start_no; --得到类型与前缀相同值的数量,主要用于判断是否产生过流水号
--判断是否有资料 没有则产生初始值插入库中
if v_num = 0 --没有记录过时
then
v_current_no := lpad ('1', p_length, '0'); --得到p_length长的0001流水号
v_result := v_current_no; --将前缀与流水号相连起来
insert into hp_no(type_name, start_no, current_no)
values (p_type_name, p_start_no, v_current_no); --将新的最大值记录下来
else 
select rowid, current_no + 1
into v_rowid, v_current_no
from hp_no
where type_name = p_type_name and start_no = p_start_no; --得到最大值加1
v_current_no := lpad (v_current_no, p_length, '0'); 
update hp_no
set current_no = v_current_no
where rowid = v_rowid; --更新最大值
end if; 
if v_start_no is null or v_start_no='' then
v_result := v_current_no;
else
v_result :=v_start_no || v_current_no;
end if;
return v_result;
end;

使用存储过程调用函数的方法:

代码

--调用function存储过程
create or replace procedure hp_pro_gettestno
(
v_firstletter in varchar2,
v_result out varchar2
)
is
v_firstvalue varchar2(30);
v_systdate varchar2(30);
begin
select to_char(sysdate,'yyyymm') into v_systdate from dual;
v_firstvalue:=(v_firstletter || v_systdate);
v_result:=hp_test_getno('hptest' ,v_firstvalue,4);
end;

结果:

  调用存储过程hp_pro_gettestno(‘hp’,4);

  结果为:hp2016060001

其它思考:

一、新增时无须显示流水号,如得到得到连续流水号

方法:

  采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用主表得到新流水号。

当插入失败则将当前流水号保存到流水号子表中,供下次取用。

当删除时,将当前流水号保存到流水号子表中,供下次取用。

二、新增时须显示流水号,如得到得到连续流水号

方法:

  采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用 主表得到新流水号。

当用户不保存或插入失败则将当前流水号保存到流水号子表中,供下次取用。

当删除时,将当前流水号保存到流水号子表中,供 下次取用。

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐