Oracle流水号生成函数
2017-02-07 11:15
357 查看
使用Oracle函数在创建表的时候自动加入生成的流水号
生成格式是:前缀+年月日+00000
直接上代码加注释
应用测试
生成格式是:前缀+年月日+00000
直接上代码加注释
CREATE OR REPLACE FUNCTION fn_no_make(v_type VARCHAR2, v_number_col VARCHAR2, v_table_name VARCHAR2) /* * 参数说明: * 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,''YYYYMMDD''), 1, 8) AS DATE_NO FROM DUAL'; EXECUTE IMMEDIATE v_sql INTO v_date_no; -- 截取日期和新的日期 v_old_num := to_number(substr(v_old_no, 13, 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; /* * 如果日期相同或者当前表为空 * 执行流水号为第一个00001 * 否则将上面计算好的流水号加入到新的流水号里面 */ IF v_old_no IS NULL OR substr(v_old_no, 4, 8) <> 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;
应用测试
-- 插入表主键和流水号 INSERT INTO TEST_A VALUES(sys_guid(),fn_no_make(901,'SERIAL_NUMBER','TEST_A'));
相关文章推荐
- oracle与sqlserver利用函数生成年月日加流水号
- oracle与sqlserver利用函数生成年月日加流水号
- oracle 函数生成流水号
- Oracle中生成随机数的函数
- oracle中生成包含大小写字符和数字的函数
- 自动生成C# 年月日加流水号的单据号、及日期时间相关函数的用法
- oracle 生成流水号
- [DB][OARCLE]在Oracle中生成GUID类型--SYS_GUID()函数
- Oracle学习记录之使用自定义函数和触发器实现主键动态生成
- oracle 顺序号生成函数。仿Sequence
- Oracle 生成流水号解决方案
- 关于oracle生成项目编号的函数
- Oracle中生成随机数的函数
- 随机生成编码(判断重复)(oracle函数)
- Oracle中生成随机数的函数
- Oracle中生成随机数的函数(转载)
- 今晚我最得意之作——利用Oracle超级无敌强大函数生成“批量生成数据语句”!
- Oracle中的自动生成guid和系统时间的函数
- Oracle由ID生成父ID的函数