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中实现这一功能。 首先,我们需要一个专门用来存储流水号的表,例如`HP_NO`,它包含三个...
`fn_no_make` 函数就是一个用PL/SQL编写的示例,专门用于生成带有特定前缀、日期和顺序编号的流水号。 首先,我们来详细解析这个函数的结构和逻辑: 1. **参数定义**: - `v_prefix`:字符串类型,表示流水号的...
一个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的函数和触发器,最近一个... “招标书编号”为字符型,编号规则为 ZBYYYYMMDDNNN, ZB是招标的汉语拼音首字母,YYYYMMDD是当前日期,NNN是三位流水号。 “投标书编号”为字符型,编号规则为
示例代码展示了在没有锁定的情况下,可能存在的并发问题,以及如何通过`FOR UPDATE`子句获取行锁,确保在锁定状态下进行流水号的生成和更新,从而避免并发冲突。 综上所述,Oracle SQL培训讲义主要涵盖了SQL的优化...
` 这个查询,它将当前日期(`SYSDATE`)转换为字符串(`TO_CHAR(SYSDATE, 'yyyymmdd')`),并结合一个流水号序列(`Flow_NO_SEQUENCE.Nextval`)和零填充,生成一个格式化的字符串。这种方式常用于创建具有日期和...
在进行数据处理时,经常需要生成长度一致的流水号,例如在创建订单时可能会使用到当天的四位数字作为流水号。例如,如果当天是第一条记录,则需要将数字“1”转换成“0001”。然而,在Oracle数据库中使用`TO_CHAR(1,...
一个典型的应用例子是在生成连续流水号时,使用FOR UPDATE子句可以确保在并发操作中正确生成唯一编号。 5. **性能优化**: - 了解如何通过索引、物化视图、分区和并行查询等技术来提升查询性能,同时避免全表扫描...
这个函数`f_createcode`接收一个基准ID(@bid)和当前时间(@d),然后将日期转换为指定格式,并结合表中的计数器生成流水号。每次插入新记录时,都会调用此函数,确保生成的流水号是唯一的。 在数据库开发中,理解...
│ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ 5.2.2 使用编号表生成流水号的示例.sql │ │ 5.2.3 生成纯字母随机编号的示例(仅大小或者小写).sql │ │ 5.2.3 生成纯字母随机编号的示例(大小写混合)....
│ 5.1.1 标识列与普通列互相转换的示例.sql │ │ 5.2.1 查表法按日期生成流水号的示例.sql │ │ 5.2.1 查表法生成流水号的示例.sql │ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ ...
该系统集成了画图设计、条形码生成、标签制作、流水号批量打印等功能于一体,界面友好、即时上手、无需任何专业知识即可轻松完成对各种数据库连接。 Label mx 的主要功能特点包括: 1. 支持多种标签类型:支持普通...
这种方法允许我们在MySQL中生成全局唯一的序列号,以满足诸如生成流水号或主键等需求。然而,这种方法可能存在并发性和性能上的局限性,因为它依赖于表级别的锁来确保序列的线程安全。在高并发环境中,可能需要考虑...
1. 解决方案:对于因关联关系导致的主键重复,按主键字段排序,使用gen_row_num_by_group函数生成唯一流水号,选择每个分组中流水号为1的记录,避免重复数据。 2. 注意事项:在进行记录筛选前务必进行排序,类似...
在Oracle数据库中,Sequence是一种非常方便的工具,用于生成唯一的序列号,常用于主键或者流水号等场景。然而,MySQL数据库本身并不直接支持类似Oracle的Sequence功能。当从Oracle迁移到MySQL时,我们需要寻找替代的...