实际工作中,难免会遇到序列号生成问题,下面就是一个简单的序列号生成函数

(1)创建自定义序列号配置表如下:

--自定义序列
create table S_AUTOCODE
(
pk1 VARCHAR2(32) primary key,
atype VARCHAR2(20) not null,
owner VARCHAR2(10) not null,
initcycle CHAR(1) not null,
cur_sernum VARCHAR2(50) not null,
zero_flg VARCHAR(2) not null,
sequencestyle VARCHAR2(50),
memo VARCHAR2(60)
);
-- Add comments to the columns
comment on column S_AUTOCODE.pk1 is '主键';
comment on column S_AUTOCODE.atype is '序列号类型';
comment on column S_AUTOCODE.owner is '序列号所有者';
comment on column S_AUTOCODE.initcycle is '序列号递增';
comment on column S_AUTOCODE.cur_sernum is '序列号';
comment on column S_AUTOCODE.zero_flg is '序列号长度';
comment on column S_AUTOCODE.sequencestyle is '序列号样式';
comment on column S_AUTOCODE.memo is '备注';
-- Create/Recreate indexes
create index PK_S_AUTOCODE on S_AUTOCODE (ATYPE, OWNER);

(2)初始化配置表,例如:

insert into s_autocode (PK1, ATYPE, OWNER, INITCYCLE, CUR_SERNUM, ZERO_FLG, SEQUENCESTYLE, MEMO)
values ('0A772AEDFBED4FEEA46442003CE1C6A6', 'ZDBCONTCN', '', '', '', '', '$YEAR$年$ORGAPP$质字第$SER$号', '质押合同中文编号');

(3)自定义序列号生成函数:

 创建函数:SF_SYS_GEN_AUTOCODE
CREATE OR REPLACE FUNCTION SF_SYS_GEN_AUTOCODE(
I_ATYPE IN VARCHAR2, /*序列类别*/
I_OWNER IN VARCHAR2 /*序列所有者*/
) RETURN VARCHAR2 IS
/**************************************************************************************************/
/* PROCEDURE NAME : SF_SYS_GEN_AUTOCODE */
/* DEVELOPED BY : WANGXF */
/* DESCRIPTION : 主要用来生成自定义的序列号 */
/* DEVELOPED DATE : 2016-10-08 */
/* CHECKED BY : */
/* LOAD METHOD : F1-DELETE INSERT */
/**************************************************************************************************/ O_AUTOCODE VARCHAR2(100); /*输出的序列号*/
V_INITCYCLE S_AUTOCODE.INITCYCLE%TYPE; /*序列号递增*/
V_CUR_SERNUM S_AUTOCODE.CUR_SERNUM%TYPE; /*序列号*/
V_ZERO_FLAG S_AUTOCODE.ZERO_FLG%TYPE; /*序列号长度*/
V_SEQUENCESTYLE S_AUTOCODE.SEQUENCESTYLE%TYPE;/*序列号样式*/
V_SEQ_NUM VARCHAR2(100); /*本次序列号*/
V_DATE_YEAR CHAR(4); /*年份,如2016*/
V_DATE_YEAR_MONTH CHAR(6); /*年份月份,如201610*/
V_DATE_DATE CHAR(8); /*年份月份日,如20161008*/
V_DATE_DATE_ALL CHAR(14); /*完整年份序列,如20161008155732*/ /*
支持的参数序列:
$YEAR$ --> 年份
$YEAR_MONTH$ --> 年份+月份,不含汉子
$DATE$ --> 年份+月份+日期,不含汉子
$DATE_ALL$ --> 完整日期,不含汉子
$ORGAPP$ --> 所有者
$SER$ --> 当前序列号
*/ --解决查询事务无法执行DML的问题
Pragma Autonomous_Transaction;
BEGIN
-- 查询复核条件的序列号配置
SELECT T.INITCYCLE,
T.CUR_SERNUM,
T.ZERO_FLG,
T.SEQUENCESTYLE
INTO V_INITCYCLE,V_CUR_SERNUM,V_ZERO_FLAG,V_SEQUENCESTYLE
FROM S_AUTOCODE T WHERE T.ATYPE=I_ATYPE AND T.OWNER=I_OWNER ; --格式化当前日期
SELECT
TO_CHAR(SYSDATE,'yyyy'),
TO_CHAR(SYSDATE,'yyyyMM'),
TO_CHAR(SYSDATE,'yyyyMMdd'),
TO_CHAR(SYSDATE,'yyyyMMddHH24MISS')
INTO V_DATE_YEAR,V_DATE_YEAR_MONTH,V_DATE_DATE,V_DATE_DATE_ALL
FROM DUAL; -- 日期处理
O_AUTOCODE := REPLACE(V_SEQUENCESTYLE,'$YEAR$',V_DATE_YEAR);
O_AUTOCODE := REPLACE(O_AUTOCODE,'$YEAR_MONTH$',V_DATE_YEAR_MONTH);
O_AUTOCODE := REPLACE(O_AUTOCODE,'$DATE$',V_DATE_DATE);
O_AUTOCODE := REPLACE(O_AUTOCODE,'$DATE_ALL$',V_DATE_DATE_ALL); --所有者处理
O_AUTOCODE := REPLACE(O_AUTOCODE,'$ORGAPP$',I_OWNER); --序号处理
V_SEQ_NUM := TO_CHAR(TO_NUMBER(V_CUR_SERNUM)+TO_NUMBER(V_INITCYCLE)); --反写当前序列号,确保每次都是递增
UPDATE S_AUTOCODE T SET T.CUR_SERNUM=V_SEQ_NUM WHERE T.ATYPE=I_ATYPE AND T.OWNER=I_OWNER ; --不满足长度的前面补0
IF LENGTH(V_SEQ_NUM) < TO_NUMBER(V_ZERO_FLAG)
THEN
      /*
LOOP
V_SEQ_NUM := ''||V_SEQ_NUM;
EXIT WHEN LENGTH(V_SEQ_NUM) = TO_NUMBER(V_ZERO_FLAG);
END LOOP;
      */
       V_SEQ_NUM := LPAD(V_SEQ_NUM,TO_NUMBER(V_ZERO_FLAG),'0');
END IF; O_AUTOCODE := REPLACE(O_AUTOCODE,'$SER$',V_SEQ_NUM); COMMIT;
RETURN O_AUTOCODE;
EXCEPTION
--如果没有对应的配置项,则返回ERROR值
WHEN NO_DATA_FOUND THEN
ROLLBACK;
DBMS_OUTPUT.put_line('there is no config as you need...');
RETURN 'ERROR';
END SF_SYS_GEN_AUTOCODE;

(4)测试:

配置项:$YEAR$年$ORGAPP$质字第$SER$号
SELECT SF_SYS_GEN_AUTOCODE('ZDBCONTCN','') FROM DUAL;

(5) 结果

2016年012805质字第0200001号

ORACLE实现自定义序列号生成的更多相关文章

  1. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  2. 关于 mybatis-generator自定义注释生成 使用DefaultCommentGenerator重写来完成

    项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人 ...

  3. Maven之自定义archetype生成项目骨架(一)

      Maven之自定义archetype生成项目骨架(一) 标签: mavennexus插件 2015-07-15 16:40 2443人阅读 评论(0) 收藏 举报  分类: Maven技术(9)  ...

  4. Oracle存储过程-自定义数据类型,集合,遍历取值

    摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...

  5. Maven之自定义archetype生成项目骨架

    Maven之自定义archetype生成项目骨架(一) http://blog.csdn.net/sxdtzhaoxinguo/article/details/46895013

  6. 微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

    1.点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量).消息多端同步.消息顺序保证等,是典型的IM技术难点. 就像即时通讯网整理的以下IM开发干货系列一样: <I ...

  7. (转)Maven之自定义archetype生成项目骨架

    背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...

  8. oracle 查询本周数据生成下周数据

      CreateTime--2018年1月4日16:38:01 Author:Marydon oracle 查询本周数据生成下周数据 第一步:查询指定区间数据 第二步:改变查询结果的值 查询日期字段+ ...

  9. 使用Redis实现高并发分布式序列号生成服务

    序列号的构成 为建立良好的数据治理方案,作数据掌握.分析.统计.商业智能等用途,业务数据的编码制定通常都会遵循一定的规则,一般来讲,都会有自己的编码规则和自增序列构成.比如我们常见的身份证号.银行卡号 ...

随机推荐

  1. 【JS基础】正则表达式

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...

  2. 手动导入swift三方danielgindi/Charts到OC工程中教程

    1.到github网址上下载zip压缩包https://github.com/danielgindi/Charts 2.然后将解压后的文件夹整个拖到自己的工程文件夹下(很多教程只让拖xcodeproj ...

  3. Android中AlarmManager使用示例(持续更新,已经更改)

    现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...

  4. Android之Dedug--Circular dependencies cannot exist in AnimatorSet

    今日,在学习AnimatorSet时,使用play.with.after.before时,代码书写如下: ObjectAnimator animator1 = ObjectAnimator.ofFlo ...

  5. MongoDB学习笔记~对集合属性的操作

    回到目录 $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$ ...

  6. Hibernatel框架基础使用

    Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...

  7. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  8. Linux配置防火墙 开启80端口的方法

    命令行输入: vi /etc/sysconfig/iptables 将 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT ...

  9. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器

    最近在Ubuntu上搭建了Asp.Net的Web服务器,其中遇到很多问题,整理一下思路,以备后用. 搭建环境以及配套软件 Ubuntu: 11.10 Mono:3.0.6 下载地址(http://do ...

  10. 用命令行工具创建 NuGet 程序包

    NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...