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;

解决方案 »

  1.   


    初步改了一下,应还是有不少错的,
    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;
    */
      

  2.   


    if object_id('PMAX_PASN','P') is not null
      drop proc PMAX_PASN
    gocreate 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
      

  3.   

    因为不清楚原表PASNMAXID这些字段的数据类型,
    修改的SP中,变量定义处对应的数据类型要做相应修改.