读书人

oracle 存储过程转 sql server 2005存

发布时间: 2013-03-26 21:10:04 作者: rapoo

oracle 存储过程转 sql server 2005存储过程
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;


[解决办法]
是网速不好,,还是在刷屏呀?
[解决办法]

SQL code
初步改了一下,应还是有不少错的,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  -- 如果该编号已经存在,则在其基础上加一,并返回  ELSEbegin  -- 从最大编号表中获得最大编号,并锁定该行    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;*/ 


[解决办法]

SQL code
if object_id('PMAX_PASN','P') is not null  drop proc PMAX_PASNgocreate proc PMAX_PASN( @strgxid varchar(max),  @strpxid varchar(max),  @strMaxID varchar(max) output)asbegindeclare @intYear intdeclare @intWeek intdeclare @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
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html

读书人网 >SQL Server

热点推荐