Oracle 中生成流水号的方法

思路:

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

涉及的表:

  流水号表hp_no:  

字段 类型
TYPE_NAME VARCHAR2(100)
START_NO VARCHAR2(100)
CURRENT_NO VARCHAR2(100)

代码:

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

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

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

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

代码

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;

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

代码

--调用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);

  结果为:hp2016060001

其它思考:

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

方法:

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

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

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

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

方法:

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

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

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

(0)

相关推荐

  • oracle(plsql)生成流水号

    复制代码 代码如下: CREATE OR REPLACE FUNCTION fn_no_make(v_prefix     VARCHAR2,                                      v_table_name VARCHAR2,                                      v_number_col VARCHAR2) /*  * v_prefix:     编码前缀两位  * v_table_name:编码所在表名  * v_num

  • Oracle 中生成流水号的方法

    思路: 通过一个流水号表,记录当前最大的流水号,以便下次取用.每次取号时,将流水号表更新成大的. 涉及的表: 流水号表hp_no: 字段 类型 TYPE_NAME VARCHAR2(100) START_NO VARCHAR2(100) CURRENT_NO VARCHAR2(100) 代码: 1)通过函数得到最大值. 有三个参数, 第一个参数是类型,便于得到不同的流水号. 第二个参数是前缀,用于在流水号前边放置特别的字符. 第三个参数是生成的流水号长度. 代码 CREATE OR REPLAC

  • Python中生成Epoch的方法

    在Python2中datetime对象没有timestamp方法,不能很方便的生成epoch,现有方法没有处理很容易导致错误.关于Epoch可以参见时区与Epoch 0 Python中生成Epoch from datetime import datetime # python3 datetime.now().timestamp() # python2 import time time.mktime(datetime.now().timetuple()) # 为了兼容python2和3,该用法使用

  • objective-c中生成随机数的方法

    本文简述objective-c中生成随机数的几种常见的方法,分享给大家,希望能给大家带来一点借鉴价值.具体如下: 1).arc4random()方法:比较精确不需要生成随即种子 使用方法如下 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc4random() % x; 获取1到x之间的整数的代码如下: int value = (arc4random() % x) + 1; 2).CCRANDOM_0_1()方法:在cocos2d中使用 ,范围

  • java在pdf中生成表格的方法

    1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110 生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf 通过读取properti

  • Oracle中日期的使用方法实例

    目录 前言 1 日期等于\大于\小于 2 日期差值计算 1 直接将两个时间来相减 2 时间和日期的两层转换 3 使用trunc函数 总结 前言 在使用sql函数时,因项目数据库不同,导致sql中日期的使用方法大不相同, 一些常见的日期计算,都有不同的应用,故整理记录一下Oracle的日期用法.以user表为例 CREATE TABLE "SCOTT"."user" ( "id" NUMBER(20,0) NOT NULL ENABLE, &quo

  • Oracle中instr函数使用方法

    INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置.只检索一次,就是说从字符的开始到字符的结尾就结束. 语法如下: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 参数分析: string1 源字符串,要在此字符串中查找. string2 要在string1中查找的字符串. start_position 代表string

  • 在MySQL中生成随机密码的方法

    cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 10 |head -10 Si1N9kUyuZ ddzsRXFgxA caDRBRT4Px buGk6LkX4d N5Xod1TOyr 1645cBxAjl KRjwJR2Txu nhQedXagL9 RraDEZgfhY QxCurm5eZF 参数说明: 如果需要特别复杂的密码可以试一下: cat /dev/urandom | LC_ALL=C tr -dc "

  • Oracle中Spool命令的使用方法实例

    前言 对于Oracle中的Spool命令,其实还可以换一种问法为,如何将sqlplus中的结果输出到指定的文件夹中. 近期在进行Oracle数据库备份的时候,由于数据库安装时出现问题,在进行逐步排查过程时,为了方便,将执行的相关语句在控制台的结果信息都输出到日志文件,以便能及时反馈到Oracle相关支持部门进行问题解决. Oracle中Spool 命令使用方法 方法/步骤 首先需要明白Spool是Oracle的命令而不是sql语句. Spool命令是将在这期间oracle所有的操作结果写入到指定

  • Oracle中正则表达式的使用实例教程

    前言 正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境. 本文主要介绍了关于Oracle中正则表达式的使用方法,下面话不多说了,来一起看看详细的介绍. Oracle使用正则表达式离不开这4个函数:regexp_like.regexp_substr.regexp_instr.regexp_replace. regexp_like 该函数只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配 //查询所

随机推荐