Oracle 中生成流水号的方法
思路:
通过一个流水号表,记录当前最大的流水号,以便下次取用。每次取号时,将流水号表更新成大的。
涉及的表:
流水号表hp_no:
VARCHAR2(100)
VARCHAR2(100)
VARCHAR2(100)
代码:
1)通过函数得到最大值。有三个参数,
第一个参数是类型,便于得到不同的流水号。
第二个参数是前缀,用于在流水号前边放置特别的字符。
第三个参数是生成的流水号长度。
代码
CREATEORREPLACEFUNCTIONHp_Test_GetNo( P_TYPE_NAMEINVARCHAR2DEFAULT'',--类型参数1 P_START_NOINVARCHAR2,--前缀参数2 P_LENGTHINNUMBER--得到流水号长度参数3 ) RETURNVARCHAR2--返回类型 IS V_RESULTVARCHAR2(100):='';--结果变量1 V_CURRENT_NOVARCHAR2(100):='';--当前值变量2 V_NUMNUMBER:=0;--补值变量3 V_START_NOVARCHAR2(100);--前缀变量4 V_ROWIDVARCHAR2(100);--要更新行的RowID变量4 BEGIN V_START_NO:=P_START_NO;--参数值赋给变量 SELECTCOUNT(*) INTOV_NUM FROMHP_NO WHERETYPE_NAME=P_TYPE_NAMEANDSTART_NO=P_START_NO;--得到类型与前缀相同值的数量,主要用于判断是否产生过流水号 --判断是否有资料没有则产生初始值插入库中 IFV_NUM=0--没有记录过时 THEN V_CURRENT_NO:=LPAD('1',P_LENGTH,'0');--得到P_length长的0001流水号 V_RESULT:=V_CURRENT_NO;--将前缀与流水号相连起来 INSERTINTOHP_NO(TYPE_NAME,START_NO,CURRENT_NO) VALUES(P_TYPE_NAME,P_START_NO,V_CURRENT_NO);--将新的最大值记录下来 ELSE SELECTROWID,CURRENT_NO+1 INTOV_ROWID,V_CURRENT_NO FROMHP_NO WHERETYPE_NAME=P_TYPE_NAMEANDSTART_NO=P_START_NO;--得到最大值加1 V_CURRENT_NO:=LPAD(V_CURRENT_NO,P_LENGTH,'0'); UPDATEHP_NO SETCURRENT_NO=V_CURRENT_NO WHEREROWID=V_ROWID;--更新最大值 ENDIF; IFV_START_NOISNULLORV_START_NO=''THEN V_RESULT:=V_CURRENT_NO; ELSE V_RESULT:=V_START_NO||V_CURRENT_NO; ENDIF; RETURNV_RESULT; END;
使用存储过程调用函数的方法:
代码
--调用function存储过程 CREATEORREPLACEPROCEDUREHp_Pro_GetTestNo ( v_FirstLetterinvarchar2, v_Resultoutvarchar2 ) IS v_FirstValuevarchar2(30); v_SystDatevarchar2(30); BEGIN selectto_char(sysdate,'yyyymm')intov_SystDatefromdual; v_FirstValue:=(v_FirstLetter||v_SystDate); v_Result:=hp_test_getno('HpTest',v_FirstValue,4); END;
结果:
调用存储过程Hp_Pro_GetTestNo('hp',4);
结果为:hp2016060001
其它思考:
一、新增时无须显示流水号,如得到得到连续流水号
方法:
采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用主表得到新流水号。
当插入失败则将当前流水号保存到流水号子表中,供下次取用。
当删除时,将当前流水号保存到流水号子表中,供下次取用。
二、新增时须显示流水号,如得到得到连续流水号
方法:
采用流水号子表,此表用于保存没有用过的流水号。当用户取号时,首选判断子表是否含有流水号,当有时,取出一个,并删除此个(防止别另外用户取用);否则调用主表得到新流水号。
当用户不保存或插入失败则将当前流水号保存到流水号子表中,供下次取用。
当删除时,将当前流水号保存到流水号子表中,供下次取用。