--创建单据号存放表
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学习笔记4——模型视图变换

    以日月地为例的一个模型视图变换.绕了比较多的弯路,下面是几个注意点总结. 注意点: 1.GL函数对模型的操作是基于当前局部坐标系,即模型坐标系而非世界坐标系,二者只在第一次初始化完毕之后才重合: 2. ...

  2. winform窗体之间通过 windows API SendMessage函数传值

    -----------------------------------------------------------‘接收窗体’代码.cs------------------------------ ...

  3. Xilinx DCM 使用---- 输出频率问题

    最近在使用Xilinx FPGA验证项目,使用DCM将50M晶振分频得到20M时钟.但是下载代码到板子上验证,发现板子完全不工作. 然后 测量时钟,发现根本就没有20M时钟.查找资料,以及跟以前项目对 ...

  4. FileUpload 上传文件,并实现c#使用Renci.SshNet.dll实现SFTP文件传输

    fileupload上传文件和jquery的uplodify控件使用方法类似,对服务器控件不是很熟悉,记录一下. 主要是记录新接触的sftp文件上传.服务器环境下使用freesshd搭建好环境后,wi ...

  5. javascript的地基

    有了良好的基础,才能在其上创造有价值的东西. 回顾一下以往自己javascript应用的开发经历,似乎很少去思考和总结js的运行机制.现在我就来整理整理 1. 以<编译原理>的一段话开头: ...

  6. Flex数据交互之Remoting

    一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...

  7. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  8. Log4net 记录日志

    配置文件 备注,需要放到根目录下面 <?xml version="1.0" encoding="utf-8"?> <configuration ...

  9. STL容器适配器 stack, queue

    stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack ...

  10. 监控数据库运行 - MS SQL 日常维护管理常用脚本(二)

    查看数据库登录名信息 use mastergoSELECT name AS LoginName , dbname AS DefaultDB , createdate AS CreateDate, up ...