--创建单据号存放表
CREATE TABLE BU_TAB(
DOC_NUM NUMBER --生成的单据号
);
--单据号
create table cux_doc_num(
tab varchar2(40), --表名
col varchar2(80), --列明
prefix varchar2(20), --前缀
sequence number --序号
);
--记得创建索引
create index cux_doc_num_u1 on cux_doc_num(tab,col,prefix);
--单据号返回函数
create or replace function get_doc_num(p_tab in varchar, --表名
p_col in varchar, --列名
p_prefix in varchar --前缀
--,seq_len in integer defatlt 3,
--,break_num_reuse varchar2 default 'N' --字符型入能,默认'N',指出是否对断号进行重用,默认不重用
)
return varchar is --返回的单据号
pragma autonomous_transaction;
--v_result varchar2(200);
n_sequence number;
c_sequence number;
l_count number;
--l_min_max varchar2(3);
v_sql varchar2(4000) := 'select nvl(max(tab.row_num),1) from (select rownum row_num from dual connect by rownum <=';
begin
--if break_num_reuse = 'Y' THEN
-- l_min_max : 'min';
--else
-- l_min_max : 'max';
--end if;
select count(*),nvl(min(sequence),0)+1 --min可以换成l_min_max
into l_count,n_sequence
from cux_doc_num ccs
where ccs.tab = p_tab
and ccs.col = p_col
and ccs.prefix = p_prefix;
dbms_output.put_line('l_count:'||l_count||'n_sequence:'||n_sequence);
if l_count = 0 then
insert into cux_doc_num
(tab,col,prefix,sequence)
values
(p_tab,p_col,p_prefix,1);
end if;
v_sql := v_sql || n_sequence || ') tab where not exists (select 1 from ' ||
p_tab || ' t where to_number(substr(t.'||p_col||',length('''||p_prefix
||''')+1,20)) = tab.row_num'||
' and substr(t.' || p_col ||',1,length('''||p_prefix||'''))='''||p_prefix||''')';
dbms_output.put_line(v_sql);
execute immediate v_sql into c_sequence;
dbms_output.put_line('c_sequence:'||c_sequence);
if c_sequence = n_sequence then
update cux_doc_num ccs
set ccs.sequence = n_sequence
where ccs.tab = p_tab
and ccs.col = p_col
and ccs.prefix = p_prefix;
end if;
commit;
return p_prefix || lpad(to_char(c_sequence),10,''); --seq_len可以替代10,实现设置长度
end get_doc_num;

oracle生成单据号的更多相关文章

  1. MySQL生成-单据号不重复

    需求生成一个单据编号 单据编号结构: “单据类型” + “日期” + “流水号” 例子 : GD201605230000007 代码: DELIMITER $$ CREATE PROCEDURE `y ...

  2. sql getdate()生成单据号

    select replace( replace( replace( replace(convert(varchar(23),getdate(),121),'-',''),':',''),' ','') ...

  3. .NET 6 在小并发下如何生成唯一单据号

    一.场景介绍 小并发下要解决生成单据号的问题,会碰到哪些问题呢?,接下来让我们一探究竟[这是小并发的解决方案,大家有更好的做好可以一起讨论分享]. 之所以叫小并发:是因为确实是小并发场景的应用模式,一 ...

  4. 用SQL存储过程生成唯一单据号

    用SQL存储过程生成唯一单据号     在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如 ...

  5. Oracle 函数 “自动生成订单号”

    create or replace function get_request_code return varchar2 AS --函数的作用:自动生成订单号 v_mca_no mcode_apply_ ...

  6. 基于mysql的单据号生成(前缀+日期+自增id+后缀)

    介绍 本次采用mysql处理,性能不是很好,对于高并发有要求的建议不要采用公司一个小项目,需要生成一个单据号,格式为: 日期 + 每日重新自增号,自己考虑了一下每日自增需要考虑并发和持久问题,两种数据 ...

  7. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)

    运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGe ...

  8. Oracle生成流水号函数

    一.参考 1:日期范围上 smalldatetime的有效时间范围1900/1/1~2079/6/6 datetime的有效时间范围1753/1/1~9999/12/31 2:精准度上 smallda ...

  9. 【SQL-自动生成编号】按规则自动生成单据编号 以及并发问题_使用触发器、函数 等

    描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否 ...

随机推荐

  1. OpenGL学习笔记2——顶点数组

    #pragma comment(lib,"glut32.lib") #pragma comment(lib,"glut.lib") #pragma commen ...

  2. 上海敏行医学招聘物理仿真,3D图形人才

    工作职能: 1.开发医学虚拟手术中的柔体仿真引擎/图形效果 2.柔体仿真引擎.和引擎开发主工程师一起完善和改进仿真引擎的开发工作. 3.3D图形效果的改进. 职位要求: 1.本科以上学历,1年以上c+ ...

  3. smb:unrecognized service

    [root@sycflash ~]#service smb status smb:unrecognized service 提示:smb:unrecognized service.这时你会按照常规的方 ...

  4. SVN服务器的搭建和使用

    VisualSVN Server和TortoiseSVN的下载,安装,汉化:SVN服务器搭建和使用(一) 如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用:SVN服 ...

  5. loaded the "ViewController" nib but the view outlet was not set.'

    错误代码: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[U ...

  6. C#多文档程序中如何只打开一个子窗口

    using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; na ...

  7. MongoDB(五)mongo语法和mysql语法对比学习

    我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与MySQL命令对比 关系型数据库一般是由数据库(datab ...

  8. PAT 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  9. 填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT

    填坑*** WARNING L15: MULTIPLE CALL TO SEGMENT 警告:发生了重入! 解释:在主循环里调用了一个函数,而在中断服务中又一次调用了同样的函数.当主循环运行到该函数中 ...

  10. iOS中UIImageView的填充模式

    UIImageView的填充模式 属性名称 imageV.contentMode枚举属性: @"UIViewContentModeScaleToFill", // 拉伸自适应填满整 ...