序列号生成存储过程

--获取序列号mssql
create PROCEDURE [dbo].[GETGLIDE]
@fn varchar(100),--序列号字典中某规则的名称
@glide VARCHAR(100) output--输出当前序列号
as
DECLARE
  @i INT =0,
  @strlen INT = 0,
  @strtemp VARCHAR(20) = '',
  @exception INT=0,
  @t_count INT=0,--当前序列号值(变化部分)
  @PREFIX VARCHAR(4),--前缀
  @POSTFIX VARCHAR(4),--后缀
  @DATEGLIDE CHAR(1),--是否包含时间 (1 包含 0 不包含)
  @GLIDELEN INT--序列号总长度
BEGIN
----初始值
 select @exception=count(*) from sys_business_glide where FNAME=@fn
 select @t_count=glide,@PREFIX=PREFIX,@POSTFIX=POSTFIX,@DATEGLIDE=DATEGLIDE,@GLIDELEN=GLIDELEN
   from sys_business_glide where FNAME=@fn
----不存在此序列号
 if(@exception=0)
  begin
   SET @glide='当前不存在此名称的序列号规则'
  END
----存在此序列号
 ELSE
  BEGIN
   SET @t_count=@t_count+1
--------拼接序列号 
   IF(@DATEGLIDE='1')--包含时间
    BEGIN
     SET @strLen=LEN(@PREFIX+REPLACE(CONVERT(varchar(10),GETDATE(),23),'-','')+cast(@t_count AS VARCHAR)+@POSTFIX)
     IF(@GLIDELEN>@strLen)--需补0
      BEGIN
       WHILE @i<(@GLIDELEN-@strLen)
       BEGIN
        SET @strtemp=@strtemp+'0' 
        set @i=@i+1
       END
       SET @glide=@PREFIX+REPLACE(CONVERT(varchar(10),GETDATE(),23),'-','')+@strtemp+cast(@t_count AS VARCHAR)+@POSTFIX
      END
     ELSE IF (@GLIDELEN=@strLen)--不需要补0
      BEGIN
       SET @glide=@PREFIX+REPLACE(CONVERT(varchar(10),GETDATE(),23),'-','')+cast(@t_count AS VARCHAR)+@POSTFIX
      END
     ELSE--长度超出
      BEGIN
       SET @glide='序列号长度设置有问题'
      END
    END
   ELSE--不包含时间
    BEGIN
      SET @strLen=LEN(@PREFIX+cast(@t_count AS VARCHAR)+@POSTFIX)
      IF(@GLIDELEN>@strLen)--需补0
       BEGIN
        SET @i=0
        WHILE @i<(@GLIDELEN-@strLen)
        BEGIN
         SET @strtemp=@strtemp+'0' 
         set @i=@i+1
        END
        SET @glide=@PREFIX+@strtemp+cast(@t_count AS VARCHAR)+@POSTFIX
       END
      ELSE IF (@GLIDELEN=@strLen)--不需要补0
       BEGIN
        SET @glide=@PREFIX+cast(@t_count AS VARCHAR)+@POSTFIX
       END 
      ELSE--长度超出
       BEGIN
        SET @glide='序列号长度设置有问题'
       END
     END
--------修改当前变化部分值
   Update sys_business_glide Set glide=cast(@t_count AS INT) Where FNAME=@fn  
  END
END

 

--获取序列号oracle

create or replace PROCEDURE GETGLIDE(fn in varchar2,fglide out varchar2) is --序列号字典中某规则的名称 输出当前序列号
  i integer :=0;
  strlen integer :=0;
  strtemp VARCHAR2(20);
  strjoin varchar2(100);
  t_exception integer :=0;
  t_count integer :=0;--当前序列号值(变化部分)
  t_prefix VARCHAR2(4);--前缀
  t_postfix VARCHAR2(4);--后缀
  t_dateglide CHAR(1);--是否包含时间 (1 包含 0 不包含)
  t_glidelen integer :=0;--序列号总长度
BEGIN
----初始值
  select count(*) into t_exception from sys_business_glide where FNAME=fn;
 select PREFIX,POSTFIX,DATEGLIDE,GLIDE,GLIDELEN into t_prefix,t_postfix,t_dateglide,t_count,t_glidelen from sys_business_glide where FNAME=fn;
----不存在此序列号
if t_exception=0 then
   fglide := '当前不存在此名称的序列号规则';
----存在此序列号
ELSE
   t_count:=t_count+1;
--------拼接序列号 
   IF t_dateglide = '1' then --包含时间
      strlen := length(t_prefix||to_char(sysdate,'YYYYMMDD')||cast(t_count AS VARCHAR2)||t_postfix);
      IF t_glidelen>strlen then --需补0
            WHILE i<(t_glidelen-strlen) loop begin  strtemp:=strtemp||'0'; i:=i+1; end; end loop; fglide:=t_prefix||to_char(sysdate,'YYYYMMDD')||strtemp||cast(t_count AS VARCHAR2)||t_postfix; 
      ELSIF t_glidelen=strlen then --不需要补0
            fglide := t_prefix||to_char(sysdate,'YYYYMMDD')||cast(t_count AS VARCHAR2)||t_postfix;
      Elsif t_glidelen<strlen then --长度超出
         fglide := '序列号长度设置有问题';
        end if;
   ELSE--不包含时间
      strlen := length(t_prefix||cast(t_count AS VARCHAR2)||t_postfix);
      IF t_glidelen>strlen then--需补0
           WHILE i<(t_glidelen-strlen) loop begin strtemp:=strtemp||'0'; i:=i+1; end; end loop; fglide:=t_prefix||strtemp||cast(t_count AS VARCHAR2)||t_postfix;
      ELSIF t_glidelen=strLen then--不需要补0
        fglide:=t_prefix||cast(t_count AS VARCHAR2)||t_postfix;
      Elsif t_glidelen<strlen then --长度超出
           fglide:='序列号长度设置有问题';
        END IF;
   END if;
--------修改当前变化部分值
Update sys_business_glide Set glide=cast(t_count AS integer) Where FNAME=fn;
END if;
   
commit;
   
exception
 when others then
 rollback;
end getglide;

测试:在sql窗口中测试成功,但是在测试窗口中失败(报无效参数);

declare mm varchar2(100);
begin
 getglide('aa',mm);
 dbms_output.put_line(mm);
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值