`
RockMen
  • 浏览: 1262 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 生成流水号函数

阅读更多
CREATE OR REPLACE FUNCTION fn_no_make(v_type       VARCHAR2,

                                      v_number_col VARCHAR2,
                                      v_table_name VARCHAR2)
/*
  * 编码示例:DJJT12090600003
  * author: Rock.et
  * create date: 2012/09/06
  * 参数说明:
  * v_type: 编码前缀
  * v_number_col:编码所在列名
  * v_table_name:编码所在表名
  */
RETURN VARCHAR2 IS
  v_old_no   VARCHAR2(50); --原编码
  v_old_num  NUMBER; -- 原编码后五位编号
  v_new_num  VARCHAR2(10); --新编码后五位编号
  v_maked_no VARCHAR2(50); --新编码
  v_date_no  VARCHAR2(20); --当前日期编号
  v_sql      VARCHAR2(4000);
BEGIN

  v_sql := 'SELECT MAX(' || v_number_col || ') FROM ' || v_table_name;
  EXECUTE IMMEDIATE v_sql
    INTO v_old_no;

  v_sql := 'SELECT SUBSTR(TO_CHAR(SYSDATE,''YYMMDD''), 1, 6) AS DATE_NO FROM DUAL';
  EXECUTE IMMEDIATE v_sql
    INTO v_date_no;

  v_old_num := to_number(substr(v_old_no, 11, 5));
  v_new_num := to_char(v_old_num + 1);

  WHILE length(v_new_num) < 5
  LOOP
    v_new_num := '0' || v_new_num;
  END LOOP;

  IF v_old_no IS NULL OR
     substr(v_old_no, 5, 6) <> v_date_no
  THEN
    v_maked_no := v_type || v_date_no || '00001';
  ELSE
    v_maked_no := v_type || v_date_no || v_new_num;
  END IF;

  RETURN(v_maked_no);
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
END fn_no_make;
分享到:
评论

相关推荐

    Oracle 中生成流水号的方法

    在Oracle数据库中,生成流水号是一项常见的需求,特别是在创建序列或者需要唯一标识的场景下。以下将详细解释如何在Oracle中实现这一功能。 首先,我们需要一个专门用来存储流水号的表,例如`HP_NO`,它包含三个...

    oracle(plsql)生成流水号

    `fn_no_make` 函数就是一个用PL/SQL编写的示例,专门用于生成带有特定前缀、日期和顺序编号的流水号。 首先,我们来详细解析这个函数的结构和逻辑: 1. **参数定义**: - `v_prefix`:字符串类型,表示流水号的...

    oracle 10进制转34进制 sql

    一个SQL脚本函数,10进制转换为34进制。34进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。

    Oracle学习记录之使用自定义函数和触发器实现主键动态生成

    很早就想自己写写Oracle的函数和触发器,最近一个... “招标书编号”为字符型,编号规则为 ZBYYYYMMDDNNN, ZB是招标的汉语拼音首字母,YYYYMMDD是当前日期,NNN是三位流水号。  “投标书编号”为字符型,编号规则为

    oracle sql培训讲义

    示例代码展示了在没有锁定的情况下,可能存在的并发问题,以及如何通过`FOR UPDATE`子句获取行锁,确保在锁定状态下进行流水号的生成和更新,从而避免并发冲突。 综上所述,Oracle SQL培训讲义主要涵盖了SQL的优化...

    6.2、oracle 相关sql1

    ` 这个查询,它将当前日期(`SYSDATE`)转换为字符串(`TO_CHAR(SYSDATE, 'yyyymmdd')`),并结合一个流水号序列(`Flow_NO_SEQUENCE.Nextval`)和零填充,生成一个格式化的字符串。这种方式常用于创建具有日期和...

    ORACLE 正数转换为字符串如何去掉前导空格

    在进行数据处理时,经常需要生成长度一致的流水号,例如在创建订单时可能会使用到当天的四位数字作为流水号。例如,如果当天是第一条记录,则需要将数字“1”转换成“0001”。然而,在Oracle数据库中使用`TO_CHAR(1,...

    Oracle SQL培训讲义

    一个典型的应用例子是在生成连续流水号时,使用FOR UPDATE子句可以确保在并发操作中正确生成唯一编号。 5. **性能优化**: - 了解如何通过索引、物化视图、分区和并行查询等技术来提升查询性能,同时避免全表扫描...

    软件工程师学习笔记大全

    这个函数`f_createcode`接收一个基准ID(@bid)和当前时间(@d),然后将日期转换为指定格式,并结合表中的计数器生成流水号。每次插入新记录时,都会调用此函数,确保生成的流水号是唯一的。 在数据库开发中,理解...

    经典SQL脚本大全

    │ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ 5.2.2 使用编号表生成流水号的示例.sql │ │ 5.2.3 生成纯字母随机编号的示例(仅大小或者小写).sql │ │ 5.2.3 生成纯字母随机编号的示例(大小写混合)....

    Sqlserver2000经典脚本

    │ 5.1.1 标识列与普通列互相转换的示例.sql │ │ 5.2.1 查表法按日期生成流水号的示例.sql │ │ 5.2.1 查表法生成流水号的示例.sql │ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ ...

    Label mx 通用条码标签设计系统.docx

    该系统集成了画图设计、条形码生成、标签制作、流水号批量打印等功能于一体,界面友好、即时上手、无需任何专业知识即可轻松完成对各种数据库连接。 Label mx 的主要功能特点包括: 1. 支持多种标签类型:支持普通...

    在MySQL中创建实现自增的序列(Sequence)的教程

    这种方法允许我们在MySQL中生成全局唯一的序列号,以满足诸如生成流水号或主键等需求。然而,这种方法可能存在并发性和性能上的局限性,因为它依赖于表级别的锁来确保序列的线程安全。在高并发环境中,可能需要考虑...

    DataServices性能优化及小技巧

    1. 解决方案:对于因关联关系导致的主键重复,按主键字段排序,使用gen_row_num_by_group函数生成唯一流水号,选择每个分组中流水号为1的记录,避免重复数据。 2. 注意事项:在进行记录筛选前务必进行排序,类似...

    基于Mysql的Sequence实现方法

    在Oracle数据库中,Sequence是一种非常方便的工具,用于生成唯一的序列号,常用于主键或者流水号等场景。然而,MySQL数据库本身并不直接支持类似Oracle的Sequence功能。当从Oracle迁移到MySQL时,我们需要寻找替代的...

Global site tag (gtag.js) - Google Analytics