日期:2014-05-18  浏览次数:20432 次

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  或用PA