一个用来生成流水号的存储过程

2024-02-17 16:18

本文主要是介绍一个用来生成流水号的存储过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们经常需要用一个流水号来唯一表示一条数据,我们有时采用队列来自动生成一个唯一的流水号,但是采用队列经常不能满足我们的需求,比如说,这个队列只能设定一个最小值,最大值,然后进行累加,不能将产生这个流水号的日期包括今这个流水号中;一种类型就要新建一个队列等。
下面这个存储过程可以产生一个流水号,它的格式是当前日期(格式YYYYMMDD)+6位的流水号数字,不同的类型只要给出一个不同的类型名称就可以了。在使用这个存储过程前,要先创建一个表来保存不同的类型,表结构如下:
create table T_GENID
(
  CLASS   NUMBER(2) not null,
  GENDATE CHAR(8) not null,
  ID      VARCHAR2(12) not null
)
tablespace SERVICE_MAIN_DAT
  pctfree 10
  pctused 80
  initrans 1
  maxtrans 255
  storage
  (
    initial 1M
    next 1M
    minextents 1
    maxextents unlimited
    pctincrease 0
  );
-- Create/Recreate primary, unique and foreign key constraints
alter table T_GENID
  add constraint PK_GENID primary key (CLASS,ID)
  using index
  tablespace SERVICE_MAIN_IDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 1M
    next 1M
    minextents 1
    maxextents unlimited
    pctincrease 0
  );

存储过程如下:
CREATE OR REPLACE PROCEDURE p_GetSerialNo
(
  i_Type                  IN     VARCHAR2,           --流水号的类型
  o_SerialNo              OUT    VARCHAR2            --返回流水号
) IS
  v_Dat                          VARCHAR2(10);
  v_SerialNum                    NUMBER(7);
BEGIN
  --取系统日期生成需要的字符串
  v_Dat := TO_CHAR(SYSDATE,('YYYYMMDD'));

  --生成产生流水号的序号
  BEGIN
    SELECT Decode(GENDATE,v_Dat,(ID+1),1)
      INTO v_SerialNum
      FROM T_GENID WHERE CLASS=i_Type FOR UPDATE;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      v_SerialNum:= 1;
      INSERT INTO T_GENID(CLASS,GENDATE,ID)
        VALUES (i_Type,v_Dat,v_SerialNum);

    WHEN TOO_MANY_ROWS THEN
      SELECT NVL(MAX(ID)+1,1)
        INTO v_SerialNum
        FROM T_GENID WHERE CLASS=i_Type;

      DELETE t_AGT_GENID WHERE CLASS=i_Type;
      INSERT INTO T_GENID(CLASS,GENDATE,ID)
        VALUES (i_Type,v_Dat,v_SerialNum);
  END;

  --修改流水号参数
  UPDATE T_GENID
     SET GENDATE = v_Dat,
         ID = v_SerialNum WHERE CLASS=i_Type;
  COMMIT;
  --得到需要的流水号
  o_SerialNo := v_Dat||Lpad(v_SerialNum,6,'0');
EXCEPTION
  WHEN OTHERS THEN
    o_SerialNo := NULL;
END;
/

使用方法很简单,就是在pl/sql中调用这个存储过程,给其设置一个类型就行了,如下:
CREATE OR REPLACE PROCEDURE p_Test
(
)
IS
  v_serId VARCHAR2(14);
BEGIN
  P_Agt_GetSerialNo ('test',v_serId);   --生成流水号,放到变量v_serId中,第一个参数就是给其设置的类型了
 
  INSERT INT t_test (testid) VALUES(v_serId);--将产生的流水号插入表中
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END;
/

这篇关于一个用来生成流水号的存储过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/718325

相关文章

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处