oracle 存储过程转 sql server 2005存储过程

fw0011 2012-05-19 01:04:14
CREATE OR REPLACE PROCEDURE
/*-------------------------------------------------
* 存储过程: PMAX_PASN
* 功能: 获得SN号码--生成SN号码
* 报告编号命名规则:前置代码+本年度后两位(XX)+本年度所在周期+ 流水号的前置代码+ 序列号
* intSize 该编号需要的长度
* strMaxID (输出)最大一级编号
-------------------------------------------------*/
PMAX_PASN (
strgxid IN VARCHAR2,
strpxid IN VARCHAR2,
strMaxID OUT VARCHAR2
)
AS
intYear INTEGER;
intWeek INTEGER;
strqzText VARCHAR2(10);
intID PASNMAXID.MAXID%TYPE; -- 最大编号值
intSize PASNMAXID.IDSIZE%TYPE; -- 最大编号长度
intExist NUMBER; -- 判断编号是否已经存在
errOverSize EXCEPTION; -- 超出最大编号范围
errSizeError EXCEPTION; -- 最大编号长度不能定义为 0,或最大编号范围指定错误
BEGIN
strqzText:='';
select to_char(sysdate,'yy') INTO intYear from dual;
select to_char(sysdate,'FMWW') INTO intWeek from dual;
select FTSNTEXT INTO strqzText from ODC_ROUTING WHERE PID = strgxid AND PXID=strpxid ;
-- 确定该最大编号类型是否已经存在
SELECT COUNT(MAXID)
INTO intExist
FROM PASNMAXID
WHERE GXID = strgxid AND PXID=strpxid AND CYEAR = intYear AND CWEEK = intWeek;

-- 如果这个最大编号没有使用,则需要重新分配一个最大编号
IF intExist=0 THEN
intID := 1;
intSize := 4;

INSERT INTO PASNMAXID
(GXID,PXID, CYEAR, CWEEK, MAXID)
VALUES
(strgxid, strpxid, intYear,intWeek, intID);

-- 如果该编号已经存在,则在其基础上加一,并返回
ELSE
-- 从最大编号表中获得最大编号,并锁定该行
SELECT MAXID,
IDSIZE
INTO intID,
intSize
FROM PASNMAXID
WHERE GXID = strgxid AND PXID=strpxid AND CYEAR = intYear AND CWEEK = intWeek;

intID := intID + 1; -- 最大编号加一

-- 校验长度范围
IF LENGTH(TO_CHAR(intID))>intSize THEN
RAISE errOverSize; -- 返回错误:超出最大编号范围
END IF;

-- 更新最大编号表
UPDATE PASNMAXID
SET MAXID = intID
WHERE GXID = strgxid AND PXID=strpxid AND CYEAR = intYear AND CWEEK = intWeek;
END IF;

-- 提交改变
COMMIT;

-- 输出最大编号
strMaxID := intYear || intWeek ||strqzText|| LPAD(TO_CHAR(intID), intSize, '0');

-- 错误捕获单元
EXCEPTION
WHEN errOverSize THEN
RAISE_APPLICATION_ERROR(-20001, '超出最大编号范围');
WHEN errSizeError THEN
RAISE_APPLICATION_ERROR(-20001, '最大编号长度定义不能为 0,或最大编号范围指定错误,请检查最大编号定义表 [ MAXIDTYPE ]。');
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, '最大编号类型未定义,请检查最大编号定义表 [ MAXIDTYPE ]。');
WHEN OTHERS THEN
RAISE;
END;
...全文
96 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-05-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
intID PASNMAXID.MAXID%TYPE; -- 最大编号值
intSize PASNMAXID.IDSIZE%TYPE; -- 最大编号长度
[/Quote]
因为不清楚原表PASNMAXID这些字段的数据类型,
修改的SP中,变量定义处对应的数据类型要做相应修改.
唐诗三百首 2012-05-19
  • 打赏
  • 举报
回复

if object_id('PMAX_PASN','P') is not null
drop proc PMAX_PASN
go

create proc PMAX_PASN
( @strgxid varchar(max),
@strpxid varchar(max),
@strMaxID varchar(max) output
)
as
begin
declare @intYear int
declare @intWeek int
declare @strqzText VARCHAR(10)
declare @intID int -- 最大编号值
declare @intSize int -- 最大编号长度
declare @intExist int -- 判断编号是否已经存在
declare @errOverSize varchar(2000) -- 超出最大编号范围
declare @errSizeError varchar(2000) -- 最大编号长度不能定义为 0,或最大编号范围指定错误

select @strqzText='';
select @intYear=datepart(yy,getdate())
select @intWeek=datepart(wk,getdate())
select @strqzText=FTSNTEXT from ODC_ROUTING WHERE PID = @strgxid AND PXID=@strpxid
-- 确定该最大编号类型是否已经存在
SELECT @intExist=COUNT(MAXID)
FROM PASNMAXID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek;

-- 如果这个最大编号没有使用,则需要重新分配一个最大编号
IF @intExist=0
begin
select @intID=1,@intSize=4

INSERT INTO PASNMAXID
(GXID,PXID, CYEAR, CWEEK, MAXID)
VALUES
(@strgxid, @strpxid, @intYear,@intWeek, @intID);
end
-- 如果该编号已经存在,则在其基础上加一,并返回
else
begin
-- 从最大编号表中获得最大编号,并锁定该行
SELECT @intID=MAXID,
@intSize=IDSIZE
FROM PASNMAXID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek;

select @intID=@intID + 1; -- 最大编号加一
end
-- 校验长度范围
IF LEN(@intID)>@intSize
return '超出最大编号范围' -- 返回错误:超出最大编号范围

-- 更新最大编号表
UPDATE PASNMAXID
SET MAXID = @intID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek;

-- 输出最大编号
select @strMaxID= @intYear+@intWeek+@strqzText+replicate('0',@intSize-len(@intID))+cast(@intID as varchar)

end
jyh070207 2012-05-19
  • 打赏
  • 举报
回复

初步改了一下,应还是有不少错的,
alter PROCEDURE
/*-------------------------------------------------
* 存储过程: PMAX_PASN
* 功能: 获得SN号码--生成SN号码
* 报告编号命名规则:前置代码+本年度后两位(XX)+本年度所在周期+ 流水号的前置代码+ 序列号
* intSize 该编号需要的长度
* strMaxID (输出)最大一级编号
-------------------------------------------------*/
PMAX_PASN (
@strgxid VARCHAR(200),
@strpxid VARCHAR(200),
@strMaxID VARCHAR(200) output
)
AS
@intYear INTEGER;
@intWeek INTEGER;
@strqzText VARCHAR(10);
@intID int;--PASNMAXID.MAXID%TYPE 或用PASNMAXID表MAXID字段的数据类型; -- 最大编号值
@intSize int;-- PASNMAXID.IDSIZE%TYPE; -- 最大编号长度
@intExist int; -- 判断编号是否已经存在
--errOverSize EXCEPTION; -- 超出最大编号范围
--errSizeError EXCEPTION; -- 最大编号长度不能定义为 0,或最大编号范围指定错误
BEGIN
set @intExist = 0
set @strqzText = '';
set @intYear = right(year(getdate()),2);
set @intWeek = datepart(week,getdate());
--select to_char(sysdate,'yy') INTO intYear from dual;
-- select to_char(sysdate,'FMWW') INTO intWeek from dual;
select @strqzText = FTSNTEXT from ODC_ROUTING WHERE PID = @strgxid AND PXID=@strpxid ;
--select FTSNTEXT INTO strqzText from ODC_ROUTING WHERE PID = strgxid AND PXID=strpxid ;
-- 确定该最大编号类型是否已经存在
select @intExist = (SELECT COUNT(MAXID)

FROM PASNMAXID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek)
/*
SELECT COUNT(MAXID)
INTO intExist
FROM PASNMAXID
WHERE GXID = strgxid AND PXID=strpxid AND CYEAR = intYear AND CWEEK = intWeek;
*/
-- 如果这个最大编号没有使用,则需要重新分配一个最大编号
IF intExist=0 --THEN
begin
set @intID =1;
set @intSize = 4;

INSERT INTO PASNMAXID
(GXID,PXID, CYEAR, CWEEK, MAXID)
VALUES
(@strgxid, @strpxid, @intYear,@intWeek, @intID);
end
-- 如果该编号已经存在,则在其基础上加一,并返回
ELSE
begin
-- 从最大编号表中获得最大编号,并锁定该行
select @intID = MAXID,@intSize = IDSIZE
FROM PASNMAXID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek
/*
SELECT MAXID,
IDSIZE
INTO intID,
intSize
FROM PASNMAXID
WHERE GXID = strgxid AND PXID=strpxid AND CYEAR = intYear AND CWEEK = intWeek;
*/
set @intID = isnull(@intID,0) + 1
--intID := intID + 1; -- 最大编号加一

-- 校验长度范围
if len(@intID) > @intSize
begin
raiserror('超出最大编号范围',16,1)
return
end

if isnull(@intSize,0) = 0
begin

raiserror('最大编号长度定义不能为 0,或最大编号范围指定错误,请检查最大编号定义表 [ MAXIDTYPE ]。',16,1)
return
end
/*
IF LENGTH(TO_CHAR(intID))>intSize THEN
RAISE errOverSize; -- 返回错误:超出最大编号范围
END IF;
*/
-- 更新最大编号表
UPDATE PASNMAXID
SET MAXID = @intID
WHERE GXID = @strgxid AND PXID=@strpxid AND CYEAR = @intYear AND CWEEK = @intWeek;

end
-- 提交改变



-- 输出最大编号
--应是年号+周+不足位加0+id构成
select @strMaxID = cast(@intYear as char) + cast(@intWeek) as char) + REPLICATE('0',@intSize - len(@intID))) + cast( @intID as char)
-- strMaxID := intYear || intWeek ||strqzText|| LPAD(TO_CHAR(intID), intSize, '0');

-- 错误捕获单元
/*
EXCEPTION
WHEN errOverSize THEN
RAISE_APPLICATION_ERROR(-20001, '超出最大编号范围');
WHEN errSizeError THEN
RAISE_APPLICATION_ERROR(-20001, '最大编号长度定义不能为 0,或最大编号范围指定错误,请检查最大编号定义表 [ MAXIDTYPE ]。');
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, '最大编号类型未定义,请检查最大编号定义表 [ MAXIDTYPE ]。');
WHEN OTHERS THEN
RAISE;
*/
寂小魔 2012-05-19
  • 打赏
  • 举报
回复
是网速不好,,还是在刷屏呀?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧