• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > Oracle 中生成流水号的方法

Oracle 中生成流水号的方法

作者:jerrylsxu 字体:[增加 减小] 来源:互联网 时间:2017-05-11

jerrylsxu通过本文主要向大家介绍了oracle生成流水号,oracle 流水号,java生成流水号,excel自动生成流水号,自动生成流水号等相关知识,希望本文的分享对您有所帮助

思路:

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

涉及的表:

  流水号表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;
</div>

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

代码

--调用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;
</div>

结果:

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

  结果为:hp2016060001

其它思考:

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

方法:

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

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

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

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

方法:

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

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Oracle 中生成流水号的方法

相关文章

  • 2017-05-11Oracle数据库如何创建第一张表
  • 2017-05-11oracle表空间中空表统计方法示例介绍
  • 2017-05-11Oracle自动备份及自动备份步骤
  • 2017-05-11Oracle date 和 timestamp 区别详解
  • 2017-05-11Oracle入侵常用操作命令整理
  • 2017-05-11Oracle中转义字符的详细介绍
  • 2017-05-11oracle中创建序列及序列补零实例详解
  • 2017-05-11oracle if else语句使用介绍
  • 2017-05-11Oracle自动备份脚本
  • 2017-05-11Oracle8i和Microsoft SQL Server比较

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • oracle 11g的警告日志和监听日志的删除方法
    • 在ORACLE移动数据库文件
    • oracle误删数据表还原的二种方法(oracle还原)
    • oracle date 类型字段的处理方法
    • Oracle密码文件的使用和维护第1/3页
    • Oracle的RBO和CBO详细介绍和优化模式设置方法
    • Oracle日常维护中管理用户以及重做日志文件的方法
    • oracle查询字符集语句分享
    • Oracle数据库安全策略分析 (三)第1/2页
    • oracle查看字符集和修改字符集使用详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有