生成规则:C+当前年月日(如:20140925)+六位数的随机数
思路:
(1)创建一个表sequence用于保存取到的序列值,如图所示:
文章图片
(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 = https://www.it610.com/article/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 = https://www.it610.com/article/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数据库生成卡号】
推荐阅读
- docker|docker导入dmp文件到oracle容器
- Linux|docker :oracle 数据恢复(导入数据库dmp文件)
- 软件编程|使用 GDB 调试多进程程序
- 笔记|数据库 左连接拼接多个表该怎么写?
- ORA-8103 “object no longer exists“错误
- Oracle|ORM框架 n+1问题 导致数据库负载飙高
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist的解决办法
- Java|Oracle 11g 数据库安装
- 数据库入门|Oracle--《基于Oracle的SQL优化》第二章总结回顾
- 数据库入门|Oracle--《基于Oracle的SQL优化》第一章总结回顾