辅助表(RUL_SEQUENCE):

表中数据如图:

辅助存储过程(Proc_GetSeqence):

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_Valueinto NowLength,SeqNowNum,LastDate,DataFormat,ResetType,IniValueFrom 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 ) thenSeqNowNum:=IniValue;end if;i:=NowLength; --i 此时表示流水号的总长度
WorkFLowStr:='<';
WHILE NowLength>0loopWorkFLowStr:=WorkFLowStr||'X';NowLength:=NowLength-1;end loop;WorkFLowStr:=WorkFLowStr||'>' ;/***********拼流水号格式 End*******/SeqNowNumStr:=to_char(SeqNowNum);NowLength:=i-length(seqNowNumStr);/***********补零操作 Start*******/WHILE NowLength>0loopSeqNowNumStr:='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=SYSDATEWHERE Is_Running='2' AND  Seq_Code=SeqCode;commit;/***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) End*******/
exception
when others then
rollback;
MessageCode:='无此编号规则'||MessageCode;end Proc_GetSeqence;-- SELECT * FROM RUL_Sequence

程序中调用:

辅助枚举:

        #region 规则代码(生成流水号的)public enum FlowNoRule{/// <summary>/// 英文数据批次号/// </summary>EnBatchNo,/// <summary>/// 中文数据批次号/// </summary>CnBatchNo}#endregion

函数:

        public string GetNextNo(Helper.EnumHelper.FlowNoRule rule){string sql = "proc_getseqence";OracleParameter[] param = {new OracleParameter("seqcode",OracleType.VarChar,20),new OracleParameter("returnnum",OracleType.VarChar,100),new OracleParameter("messagecode",OracleType.VarChar,500)};param[0].Direction = ParameterDirection.Input;param[0].Value = rule.ToString();param[1].Direction = ParameterDirection.Output;param[2].Direction = ParameterDirection.Output;OracleHelper.ExecuteNonQuery(CommandType.StoredProcedure, sql, param);if (param[2].Value.ToString() == "888"){//调用成功,返回最新流水号return param[1].Value.ToString();}else{//调用失败,返回错误消息throw new Exception(param[2].Value.ToString());}}

Oracle 生成流水号相关推荐

  1. java oracle 流水号_Oracle生成流水号函数

    一.参考 1:日期范围上 smalldatetime的有效时间范围1900/1/1~2079/6/6 datetime的有效时间范围1753/1/1~9999/12/31 2:精准度上 smallda ...

  2. oracle生成工单号,订单流水号(唯一编号)的生成

    (1)通过存储过程方式生成(以Oracle为例) Create Or Replace Procedure MyProcedure { CV_1 OUT NVARCHAR2 } AS BEGIN DEC ...

  3. oracle存储过程生成单号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 CREATE OR REPLACE procedure ...

  4. oracle存储过程插入自动编号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 0 then if DIsAutoCreate=1 TH ...

  5. 使用ORACLE生成文本文件

    1.在使用ORACLE的存储过程生成文件 在ORACLE中生成文件是比较方便的,尤其是生成对外接口的时候,通过定时任务完成,是一个非常直接的方法,而且比编译式语言具有更加灵活的方式. 使用PL/SQL ...

  6. oracle索引自增函数,oracle生成动态前缀且自增号码的函数分享

    create or replace Function GetInvitationNO(prev varchar2, num1 varchar2, num2 varchar2, sessionSetti ...

  7. oracle 随机数重复吗,Oracle生成不重复随机数

    项目中要依据车牌号码.日期和随机码生成运单号,所以写了函数和创建了历史码存储表来保证运单号的不重复. 运单号=车牌号码+日期+四位随机码 1.创建历史运单号存储表(用来比对新生成的随机号是否已被使用) ...

  8. 根据时间戳生成编号_使用雪花算法生成流水号!

    前言"在分布式系统中常见的问题就是如何生成流水号,一般情况下会有专门的流水号系统,不过在开发过程中或者开发早期不一定会有专门流水号系统,在这里介绍下我所使用的流水号生成器--雪花算法&quo ...

  9. 用SerialNumber生成流水号

    在很多程序的应用中,有许多的地方会用到流水号,我写了个专门用来生成流水号的类 使用: SerialNumber sn=new SerialNumber(); sn.getSerialNum(table ...

最新文章

  1. Mysql基础运用(视图,变量,存储,流程控制)
  2. maven乱码解决方案---修改maven编码
  3. cobertura 使用_使用Cobertura,JUnit,HSQLDB,JPA涵盖您的测试
  4. 前端学习(1961)vue之电商管理系统电商系统之调用api获取数据
  5. mysql数据库自学_MySQL数据库自学
  6. Kepware欧姆龙驱动简介
  7. BOCHS 模拟器和我的启动代码
  8. golang接口与反射剖析
  9. python化学公式配平_最简单易懂的化学方程式的配平方法
  10. 怎么管理一个测试团队
  11. bmob云服务器信息推送,FAQ-Bmob后端云
  12. 乐高太多没处放?解放女朋友双手,1 个顶 100 个的乐高智能分拣机来了!
  13. WOL网络唤醒远程开机的关键步骤,魔术唤醒一步都不能少!
  14. 2022年建筑装饰行业报告:企业微网蓄势待发,万亿赛道谁主沉浮?
  15. 《数据统计分析及R语言编程(第二版)》练习题总结(一)
  16. 看EyeEm如何在产品开发中整合、运用深度学习模型
  17. 如何配置tracker?
  18. 5-5 圆周率Java
  19. 二叉树进阶--二叉搜索树
  20. 解决 clean-webpack-plugin www has been removed 问题

热门文章

  1. 江西财经职业学院计算机应用技术代号,江西财经职业学院计算机协会第三届PPT创意大赛...
  2. Linux nohup命令(即使xshell终端关闭,程序依然可以在跑)
  3. [Vue warn]: Duplicate keys detected: ‘user‘. This may cause an update error. 解决方法
  4. 修改git已提交的commit中提交者的用户名和邮箱
  5. paxos协议 对比_分布式一致性协议三部曲-深入理解一致性协议Paxos
  6. Unity2D游戏开发——相机跟随主角
  7. #数据技术选型#即席查询Shib+Presto,集群任务调度HUE+Oozie
  8. 《数据结构-耿国华第三版》算法要点总结
  9. OpenCV Mat 图像处理基本操作
  10. 二极管正向压降测试仪适合在哪里应用?