Oracle生成流水号

  • 流水号规则表Rul_Sequence:

规则表中的数据:

生成流水号辅助的存储过程:

CREATE OR REPLACE PROCEDURE Proc_GetSeqence(SeqCode in  varchar2,ReturnNum out Varchar2,MessageCode out varchar2 )    -- 异常消息等
is
seqNowNumStr VARCHAR2(20);
SeqNowNum int;            --当前值
year CHAR(4);                --年 YYYY
month CHAR(2);                --月 MM
day CHAR(2)    ;            --日 DD
NowLength int;                    --流水号长度
DataFormat VARCHAR2(50);        --流水号规则
IniValue int;                --归零值
ResetType VARCHAR2(10);        --归零方式
LastDate    CHAR(8);            --日期最大值
WorkFLowStr VARCHAR2(20);     --前一次调用流水号时的日期值
DataNow CHAR(8);            --当前日期
i int;                        --转换变量,作用参照代码上下文
begin

    /* 初始化变量 */
     MessageCode:=‘888‘;--成功执行
     ReturnNum := ‘0‘;
     NowLength:=0;
     SeqNowNum :=0;
     DataNow:=to_char(sysdate,‘yyyymmdd‘); --得到 20130704 的时间格式
     year:=substr(DataNow,1,4);
     month :=substr(DataNow,5,2);
     day :=substr(DataNow,7,2);
   i:=1 ;

   Select   Value_length,Now_SeqValue,Date_Max,Data_Format,Reset_Type,Init_Value
           into NowLength,SeqNowNum,LastDate,DataFormat,ResetType,IniValue
            From RUL_Sequence where Seq_Code=SeqCode;

 <<wait>>
 Update RUL_Sequence Set Is_Running=‘2‘ where Seq_Code=SeqCode and is_running=‘1‘;
 if sql%rowcount=0 then
   /***********如果有并发的正在运行,最多等待1秒,然后继续运行 *******/
   dbms_lock.sleep(1); --grant execute on dbms_lock to dhlink 需要授权
   goto wait;
end if;
commit;

If (ResetType=2 and DataNow<>LastDate  AND IniValue>0)
        OR (ResetType=3 and year||month<>substr(LastDate,1,6) AND IniValue>0)
        OR (ResetType=4 and year<>substr(LastDate,1,4) AND IniValue>0 ) then
            SeqNowNum:=IniValue;
 end if;

i:=NowLength; --i 此时表示流水号的总长度
WorkFLowStr:=‘<‘;
WHILE NowLength>0
     loop
         WorkFLowStr:=WorkFLowStr||‘X‘;
         NowLength:=NowLength-1;
     end loop;
     WorkFLowStr:=WorkFLowStr||‘>‘ ;
     /***********拼流水号格式 End*******/

     SeqNowNumStr:=to_char(SeqNowNum);
     NowLength:=i-length(seqNowNumStr);

     /***********补零操作 Start*******/
     WHILE NowLength>0
     loop
         SeqNowNumStr:=‘0‘||SeqNowNumStr;
         NowLength:=NowLength-1;
     end loop;
     /***********补零操作 End*******/

     ReturnNum:=REPLACE(DataFormat,‘<YYYY>‘,year);            -- 把规则中<YYYY>替换成相应年
     ReturnNum:=REPLACE( ReturnNum,‘<MM>‘,month);                -- 把规则中<MM>替换成相应月
     ReturnNum:=REPLACE( ReturnNum,‘<DD>‘,day);                -- 把规则中<DD>替换成相应日
     ReturnNum:=REPLACE( ReturnNum,WorkFLowStr,SeqNowNumStr);-- 把规则中的形如<XXX>的替换成相应流水号,

     /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) Start*******/

     UPDATE RUL_Sequence SET Now_SeqValue=SeqNowNum+1,Date_Max=DataNow,IS_RUNNING=‘1‘, Edit_Time=SYSDATE
     WHERE Is_Running=‘2‘ AND  Seq_Code=SeqCode;
     commit;
     /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) End*******/
exception
when others then
rollback;
MessageCode:=‘无此编号规则‘||MessageCode;

end Proc_GetSeqence;

-- SELECT * FROM RUL_Sequence
时间: 2024-11-06 12:34:16

Oracle生成流水号的相关文章

Oracle生成流水号函数

1:日期范围上 smalldatetime的有效时间范围1900/1/1~2079/6/6 datetime的有效时间范围1753/1/1~9999/12/31 2:精准度上 smalldatetime只精准到分,而datetime则可精准到3位的毫秒. 3:存储空间上 smalldatetime占用4个字节,前2个字节存储base date(1900年1月1日)之后的天数.后2个字节存储午夜后的分钟数. datetime占用8个字节,前4个字节存储base date(即1900年1月1日)之前

生成流水号的优化

最近写的项目有一个生成流水号的场景,数据需要设置到千万. 场景:客户查询时需要上传文件,为文件生成递增的流水号,需要递增,数量要预留千万. 问题:因为上传文件的频率并不高,所以不适合使用批量操作.但是每次上传都要去oracle数据库读取上一次的流水号,感觉效率很低. 解决方案:原理:使用Redis实现类似于Lazy load的流水号加载. 每次上传先检查Redis中是否有最新的流水号,如果有则直接使用,并将原值更新为自增后的值.如果没有,则从oracle数据库中加载一次存入Redis. 这样可以

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

java中生成流水号的一个例子(使用关系型数据库)

在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水号的时候根据公司和日期联合起来生成的这个业务编码去数据库里边去查,若有记录的话就把记录的话就把对应的序列值返回,然后序列的值加一,若根据对应的业务编码查询不到相应的记录就把流水号对应的最小的值返回,然后在数据库中插入相应的记录 这种场景使用类似BerkeleyDB这种K,Value对数据库来实现是最

mysql 生成流水号 存储过程 订单编号

用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例.(新的一天的流水号从1开始,如:今天的订单编号是CD2013010900014,下一个订单编号将是CD2013010900015:明天的订单编号将从CD2013011000001开始) 生成规则:    2位前缀+年月日+5位流水号     或者 2位前缀+年月日时分+5位流水号     或者 2位前缀+年月日时分秒+5位流水号. 测试订单表(test_orders): 1 CREATE TABLE `test_orders`

Oracle生成千万测试数据

oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法.产生测试数据的SQL如下: SQL> select rownum as id, 2                                 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_

SQL Server 存储过程生成流水号

SQL Server利用存储过程生成流水号 USE BiddingConfig SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO -- ============================================= -- Author: 小爽 -- Create date: 2017-05-25 -- Description: 业务数据KEY生成 -- 构成规则: [区域编号][应用系统编号][版本编号][功能编号][日期戳][流水记录号]

java中生成流水号的一个例子(使用BerkeleyDB)

package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; /** * Created with IntelliJ IDEA. * User: 焦一

Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                         Default.aspx 网页界面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.