oracle数据库生成卡号

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

思路:

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

                oracle数据库生成卡号_第1张图片

               (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位。

                      

                


你可能感兴趣的:(oracle)