oracle 卡号以数字开头,oracle数据库生成卡号

生成规则:C+当前年月日(如:20140925)+六位数的随机数

思路:

(1)创建一个表sequence用于保存取到的序列值,如图所示:

33e2a43cbf063babd4433ed7620155f7.png

(2)创建三个函数setval(),nextval(),currval()

作用:

setval():作用是重置表sequence中current_value的值。

nextval():作用是使表sequence中current_value的值加1。

currval():作用是求出当前sequence中current_value的值。

代码:

setval()

CREATE OR REPLACE FUNCTION setval

(

seq_name IN VARCHAR2,

val IN NUMBER

)

return NUMBER IS tab_sequ_val NUMBER;

BEGIN

UPDATE sequence

SET current_value = val

WHERE name = seq_name;

RETURN currval(seq_name);

END setval;

nextval()

CREATE OR REPLACE FUNCTION nextval

(

seq_name IN VARCHAR2

)

return NUMBER

IS tab_sequ_val NUMBER;

BEGIN

UPDATE sequence

SET current_value = current_value + 1

WHERE name = seq_name;

RETURN currval(seq_name);

END nextval;

currval()

CREATE OR REPLACE FUNCTION currval

(

seq_name IN VARCHAR2

)

return NUMBER

AS tab_sequ_val NUMBER;

BEGIN

SELECT current_value INTO tab_sequ_val

FROM sequence

WHERE name = seq_name;

return(tab_sequ_val);

END currval;

(3)编写存储过程,生成卡号。

思路:根据当前时间查询表中是否有今天的数据,如果没有直接把表中序列赋值为‘000001’。如果有值,把表中的current_value值加1,并判断这个值的长度,如果小于6

就做循环在前面补0,知道补到6位为止。

create or replace procedure pro_geCardNO

(cardNONum OUT VARCHAR2)

is

--循环的次数

i NUMBER;

--当前时间是否插入过数据

counts NUMBER;

--序列的值

currentNum_number NUMBER;

--拼接后序列的值

currentNum_numbers VARCHAR2(300);

--当前时间

currentNum_date VARCHAR2(300);

--序列的长度

currentLength NUMBER;

begin

--生成当前系统时间

counts:=0;

currentNum_date := TO_CHAR(SYSDATE,'YYYYMMDD');

cardNONum:='C'|| currentNum_date;

i:=0;

select count(*) into counts from PM_CARD pc where pc.RECORD_DT=to_date(currentNum_date,'yyyymmdd');

if counts=0 then

cardNONum:='000001';

currentNum_number := setval('SEQ_PM_CARDNO_ID',1);

return;

end if;

currentNum_number := nextval('SEQ_PM_CARDNO_ID');

currentLength:=LENGTH(currentNum_number);

currentNum_numbers := to_char(currentNum_number);

if currentLength <6 THEN

loop

currentNum_numbers:='0'||currentNum_numbers;

i:=i+1;

EXIT WHEN i>6-currentLength ;

end loop;

cardNONum:=currentNum_numbers;

end if;

end ;

当时项目比较赶,只能借用以前缩写的函数,和表。简便的思路为:

(1)创建一个序列最大为999999,最小为1,每次递增1.

(2)创建一个存储过程用于生成卡号。

存储过程的思路:求当前时间是否有数据,如果没有,重置序列,让他当前序列值为‘1’,并且循环补齐到6位如“000001”,如果有值求出下一个序列,循环补齐到6位。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值