oracle 中生成流水号 方法

摘要:
第二个参数是前缀,用于在序列号之前放置特殊字符。第三个参数是生成的序列号的长度。当用户获取一个数字时,首先要判断子表是否包含序列号。如果是,请选择一个并删除它;否则,调用主表以获取新的流水编号。

思路:

 通过一个流水号表,记录当前最大的流水号,以便下次取用。每次取号时,将流水号表更新成大的。

涉及的表:

   流水号表hp_no:  

字段类型
TYPE_NAMEVARCHAR2(100)
START_NOVARCHAR2(100)
CURRENT_NOVARCHAR2(100)

 代码:

1)通过函数得到最大值。 有三个参数,

  第一个参数是类型,便于得到不同的流水号。

  第二个参数是前缀,用于在流水号前边放置特别的字符。

  第三个参数是生成的流水号长度。

oracle 中生成流水号 方法第1张oracle 中生成流水号 方法第2张代码
CREATE OR REPLACE FUNCTION Hp_Test_GetNo(
   P_TYPE_NAME   
IN   VARCHAR2 DEFAULT '',  --类型 参数1
   P_START_NO    IN   VARCHAR2,  --前缀 参数2
   P_LENGTH      IN   NUMBER    --得到流水号长度 参数3
)
   
RETURN VARCHAR2      --返回类型
IS
   V_RESULT       
VARCHAR2 (100) := '';   --结果   变量1
   V_CURRENT_NO   VARCHAR2 (100) := '';  --当前值  变量2
   V_NUM          NUMBER         := 0;  --补值    变量3
   V_START_NO   VARCHAR2(100);    --前缀    变量4
   V_ROWID        VARCHAR2 (100);    --要更新行的RowID  变量4
BEGIN
   V_START_NO :
=P_START_NO;  --参数值赋给变量

   
SELECT COUNT (*)
     
INTO V_NUM
     
FROM HP_NO
    
WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO;    --得到类型与前缀相同值的数量,主要用于判断是否产生过流水号

--判断是否有资料 没有则产生初始值插入库中
   IF V_NUM = 0  --没有记录过时
   THEN
      V_CURRENT_NO :
= LPAD ('1', P_LENGTH, '0');  --得到P_length长的0001流水号
      V_RESULT := V_CURRENT_NO;  --将前缀与流水号相连起来

      
INSERT INTO HP_NO(TYPE_NAME, START_NO, CURRENT_NO)
           
VALUES (P_TYPE_NAME, P_START_NO, V_CURRENT_NO);  --将新的最大值记录下来
   ELSE  
      
SELECT ROWID, CURRENT_NO + 1
      
INTO V_ROWID, V_CURRENT_NO
        
FROM HP_NO
       
WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --得到最大值加1

      V_CURRENT_NO :
= LPAD (V_CURRENT_NO, P_LENGTH, '0');     
      
      
      
UPDATE HP_NO
         
SET CURRENT_NO = V_CURRENT_NO
       
WHERE ROWID = V_ROWID;    --更新最大值
   END IF;  

   
IF V_START_NO IS NULL OR V_START_NO='' THEN
      V_RESULT :
= V_CURRENT_NO;
   
ELSE
      V_RESULT :
=V_START_NO || V_CURRENT_NO;
   
END IF;
   
   
RETURN V_RESULT;
END;


使用存储过程调用函数的方法:

oracle 中生成流水号 方法第3张oracle 中生成流水号 方法第4张代码
--调用function存储过程
CREATE OR REPLACE PROCEDURE Hp_Pro_GetTestNo
(
      v_FirstLetter 
in varchar2,
      v_Result out  
varchar2
)
   
IS
      v_FirstValue 
varchar2(30);
      v_SystDate 
varchar2(30);
BEGIN
     
select to_char(sysdate,'yyyymm'into v_SystDate from dual;
     v_FirstValue:
=(v_FirstLetter || v_SystDate);
     v_Result:
=hp_test_getno('HpTest' ,v_FirstValue,4);
END;


结果:

   调用存储过程Hp_Pro_GetTestNo('hp',4);

  结果为:hp2010020001

其它思考

一、新增时无须显示流水号,如得到得到连续流水号

 方法:

  采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用主表得到新流水号。

当插入失败则将当前流水号保存到流水号子表中,供下次取用。

当删除时,将当前流水号保存到流水号子表中,供下次取用。


二、新增时须显示流水号,如得到得到连续流水号

方法:

  采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用 主表得到新流水号。

当用户不保存或插入失败则将当前流水号保存到流水号子表中,供下次取用。

当删除时,将当前流水号保存到流水号子表中,供 下次取用。

其它思考的代码我没有写,有兴趣的朋友可以自己写。

免责声明:文章转载自《oracle 中生成流水号 方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 线程更新uiasp 获取url 返回值 和 对json 返回值的处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Winform通用模块之流水号生成

  打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点。 1、数据库表及存储过程     在介绍这个通用流水号生成的模块前,我们先来看一下其相关的表结构:   从上图中我们可以看到,该模块用到的数据表有两个,其实用一个表也可以实现这个功能,我想很多人用到的也只是一个表,但我为什么要分为两个...

MERGE 用法

1、不带输出的SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[InsertShiGongJiao] @number varchar(100), @companyindex int, @lineid int, @stationid int, @direct int, @...

sqlserver 规则式定制化生成流水号

--规则式定制化流水号,需先取最大值以及数据特殊变化字符串ALTER FUNCTION [dbo].[f_GivenNo] ( @strRule VARCHAR(50), --规则 @maxStr VARCHAR(50), --取最大号数据编号 @Astr VARCHAR(30) ,--最大号数据的产品类别字符串 @NAst...

SAP流水号

[转]编号范围对象维护Tcode: SNRO OYSM   1.Number Range的通用Tcode:SNRO   2.Number Range的通用读取函数:NUMBER_GET_NEXT 3.如有跳号现象,可以禁用对象的Buffer试试 4.几个关于Number Range的函数组:SNR0  Online maint. of number ra...

BarTender怎样同时打印自动日期和流水号?

大多数条形码中都会含有日期和数量信息,而且大部分都是两者兼具。有些使用BarTender软件的小伙伴,不知道怎么同时打印自动日期和流水号,即条形码中兼有自动日期和序列号,且它们都能根据打印的变化而变化。下面,小编就演示下具体的操作过程。 1、运行BarTender 2016,以Code 128码为例,在标签中适当位置生成一个条形码。双击条码,打开条形码属...

Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法

1. 事件起因: 当在sqlserver 中利用 时间戳(22010110) + 请求终端ID (1001) + 四位流水号(开始0001) ; 四位流水号算法创建表TZD_LSH ;其中id是 自增长 ;系数1 insert into TZD_LSH (Hoisd) select @hospcode select newid = m...