自动生成流水号(后台数据)

--DEMO
复制代码
  --存储过程实现流水号
  create or replace procedure cux_get_serial_number(p_model_name in varchar2, --模块 参数1
                                                    p_start_no   in varchar2, --前缀 参数2
                                                    p_length     in number, --得到流水号长度 参数3
                                                    p_y_n        in varchar2, --是否显示模块
                                                    p_separator  in varchar2 DEFAULT null, --分隔符
                                                    x_serial_no  out varchar2) is
  v_result     varchar2(100) := ''; --结果 变量1
  v_current_no varchar2(100) := ''; --当前值 变量2
  v_num        number := 0; --补值 变量3
  v_start_no   varchar2(100); --前缀 变量4
  v_rowid      varchar2(100); --要更新行的rowid 变量4
  v_yyyy       varchar2(100); --
  v_mm         varchar2(100); --
  v_dd         varchar2(100); --
  v_serial_num number; --流水号
  v_curr_num   varchar2(100);
begin
  v_yyyy := to_char(sysdate, 'yyyy');
  v_mm   := to_char(sysdate, 'mm');
  v_dd   := to_char(sysdate, 'dd');
  --获取流水号前缀
  v_start_no := p_start_no; --参数值赋给变量
  select max(ces.current_no)
    into v_serial_num
    from cux.cux_ebs_system_no ces
   where ces.module_name = p_model_name
     and ces.start_no = p_start_no --得到类型与前缀相同值的数量,主要用于判断是否产生过流水号
     and ces.yyyy = v_yyyy
     and ces.mm = v_mm
     and ces.dd = v_dd;
  --判断是否有资料 没有则产生初始值插入库中
  --没有产生过
  if v_serial_num is null then
    --得到当前日期起始流水号
    --得到p_length长的0001流水号
    v_current_no := lpad('1', p_length, '0');
    v_curr_num   := v_current_no;
    insert into cux.cux_ebs_system_no
      (module_name, start_no, yyyy, mm, dd, current_no, create_date)
    values
      (p_model_name, p_start_no, v_yyyy, v_mm, v_dd, v_current_no, sysdate);
  else
    --当前日期已经产生过流水号,取最大流水号+1
    --v_curr_num := v_serial_num + 1; v_curr_num := lpad(v_serial_num + 1, p_length, '0'); update cux.cux_ebs_system_no ces set ces.current_no = v_curr_num, ces.last_update_date = sysdate where ces.module_name = p_model_name and ces.start_no = p_start_no and ces.yyyy = v_yyyy and ces.mm = v_mm and ces.dd = v_dd;
  end if;
  commit;
  if p_y_n = 'Y' then
    if p_separator is null then
      x_serial_no := p_model_name || p_start_no || v_yyyy || v_mm || v_dd ||
                     v_curr_num;
    else
      x_serial_no := p_model_name || p_start_no || p_separator || v_yyyy || v_mm || v_dd ||
                     v_curr_num;
    end if;
  elsif p_y_n = 'N' then
    if p_separator is null then
      x_serial_no := p_start_no || v_yyyy || v_mm || v_dd || v_curr_num;
    else
      x_serial_no := p_start_no || p_separator || v_yyyy || v_mm || v_dd ||
                     v_curr_num;
    end if;
  end if;
end;
-----表结构
-- Create table
create table CUX.CUX_EBS_SYSTEM_NO
(
module_name VARCHAR2(100),
start_no VARCHAR2(100),
yyyy VARCHAR2(100),
mm VARCHAR2(100),
dd VARCHAR2(100),
current_no NUMBER,
create_date DATE,
last_update_date DATE
)
tablespace APPS_TS_TX_DATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 128K
next 128K
minextents 1
maxextents unlimited
pctincrease 0
);
-- Add comments to the table
comment on table CUX.CUX_EBS_SYSTEM_NO
is 'EBS模块对应生成的流水号';
-- Add comments to the columns
comment on column CUX.CUX_EBS_SYSTEM_NO.module_name
is '模块例如(PO,WIP)';
comment on column CUX.CUX_EBS_SYSTEM_NO.start_no
is '流水号开始前缀';
comment on column CUX.CUX_EBS_SYSTEM_NO.yyyy
is '';
comment on column CUX.CUX_EBS_SYSTEM_NO.mm
is '';
comment on column CUX.CUX_EBS_SYSTEM_NO.dd
is '';
comment on column CUX.CUX_EBS_SYSTEM_NO.current_no
is '流水号';
 
-----end---
 
----function 方式实现
 
create or replace function cux_get_serial_number_function(p_model_name in varchar2, --模块 参数1
                                                          p_start_no   in varchar2, --前缀 参数2
                                                          p_length     in number, --得到流水号长度 参数3
                                                          p_y_n        in varchar2, --是否显示模块
                                                          p_separator  in varchar2 DEFAULT null --分隔符
                                                          ) return varchar2 is
  x_result varchar2(200);
  pragma autonomous_transaction;
begin
  cux_get_serial_number(p_model_name,
                        p_start_no,
                        p_length,
                        p_y_n,
                        p_separator,
                        x_result);
  return x_result;
end;
 
 
 
 
复制代码

 

 
 
 
 
 
posted @   Iven_lin  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示