--获取序列号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;