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

(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. Python学习

    Python基础教程        网易云课堂-零基础入门学习Python

  2. 记录一次bug解决过程:数据迁移

    一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...

  3. Flexible 弹性盒子模型之CSS flex-basis 属性

    实例 设置第二个弹性盒元素的初始长度为 80 像素: div:nth-of-type(2){flex-basis:80px;}   效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本 ...

  4. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  5. Android开发学习—— shape标签的使用

    参考这片文章http://www.cnblogs.com/armyfai/p/5912414.html

  6. Atitit.研发管理如何避免公司破产倒闭的业务魔咒

    Atitit.如何避免公司破产倒闭的业务魔咒 1. 大型公司的衰落或者倒闭破产案例1 1.1. 摩托罗拉1 1.2. 诺基亚2 1.3. sun2 2. 为什么他们会倒闭?? 常见的一些倒闭元素2 2 ...

  7. 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞

    使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...

  8. MySQL数据库罕见的BUG——Can't get hostname for your address

    在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...

  9. 远程连接mysql 1130错误解决方法

  10. Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步.  ...