免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4334 | 回复: 1
打印 上一主题 下一主题

AS400/DB2 PROCEDURE Error: Invalid cursor state [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-22 12:10 |只看该作者 |倒序浏览
CREATE PROCEDURE REPORT.CSHEET_CO_SP_SEW03
(
    INOUT   pERRCDE         INTEGER,
    INOUT   pERRDSC         CHAR(96),
    INOUT   pFUNNAM         CHAR(30),
    INOUT   pSQLSTATE       CHAR(5)
)

LANGUAGE SQL

BEGIN

    DECLARE SQLSTATE    CHAR(5) DEFAULT '00000';
    DECLARE SQLCODE     INTEGER DEFAULT 0;
    DECLARE SQLEOF      INTEGER DEFAULT 0;
    DECLARE SQLIGNORE   INTEGER DEFAULT 0;

    DECLARE mERRCDE     CHAR(96);
    --DECLARE mTIME       VARCHAR(5000) DEFAULT '';

    DECLARE mCONO       DECIMAL(3,0);
    DECLARE mFACI       GRAPHIC(3)  CCSID 13488;
    DECLARE mSCHN       DECIMAL(11,0);
    DECLARE mHDPR       GRAPHIC(15) CCSID 13488;
    DECLARE mSTDT       DECIMAL(8,0);

    DECLARE lSTYL       VARCHAR(20);
    DECLARE lPLGR       GRAPHIC(  CCSID 13488;
    DECLARE mPOLS       VARCHAR(400)  DEFAULT '';

    DECLARE cNumFGC     VARCHAR(1000);
    DECLARE sNumFGC     VARCHAR(1000);

    DECLARE C1 CURSOR FOR
        SELECT VHCONO,VHFACI,VHSCHN,
               CASE WHEN MMCHCD IN (0,2) THEN
                  MMITNO
               ELSE
                  MMHDPR
               END VHHDPR,
               MIN(VHSTDT) AS VHSTDT
          FROM MVXCDTATAL.MWOHED
         INNER JOIN MVXCDTATAL.MITMAS
            ON VHCONO = MMCONO
           AND VHPRNO = MMITNO
          WHERE VHCONO = 100 AND VHFACI = 'TG1'
      GROUP BY VHCONO,VHFACI,VHSCHN,
               CASE WHEN MMCHCD IN (0,2) THEN
                 MMITNO
               ELSE
                 MMHDPR
               END
    FOR READ ONLY;

    DECLARE C2 CURSOR FOR
     SELECT DISTINCT VOPLGR FROM MVXCDTATAL.MWOOPE
      WHERE VOCONO = 100 AND VOFACI = mFACI AND VOPLGR LIKE '4%' AND VOSCHN = mSCHN AND VOPRNO LIKE lSTYL
    FOR READ ONLY;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET SQLEOF = 1;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '24501' SET SQLIGNORE = 1;

    DECLARE EXIT HANDLER FOR SQLSTATE 'XGOOK'
    XHDLOK: LOOP
      SET pSQLSTATE = '00000';
      SET pERRCDE   = 0;
      SET pERRDSC   = 'OK';
    LEAVE XHDLOK;
    END LOOP;

    DECLARE EXIT HANDLER FOR SQLSTATE 'ERROR'
    XHDLERROR: LOOP
      SET pSQLSTATE = SQLSTATE;
      SET pERRCDE   = SQLCODE;
      SET pERRDSC   = 'ERR:' || rtrim(mERRCDE) || '->' || SQLSTATE ;
    LEAVE XHDLERROR;
    END LOOP;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    XHDLFATAL: LOOP
      SET pSQLSTATE = SQLSTATE;
      SET pERRCDE   = SQLCODE;
      SET pERRDSC   = rtrim(mERRCDE) || '->' || SQLSTATE ;
    LEAVE XHDLFATAL;
    END LOOP;

    SET mERRCDE   = 'START AT ' || SUBSTR(CHAR(CURRENT TIMESTAMP),1,25) ;
    SET pFUNNAM   = 'REPORT.CSHEET_CO_SP_SEW';
    SET pSQLSTATE = '00000';
    SET pERRCDE   = 0;
    SET pERRDSC   = '';
   
    OPEN C1 ;
    LP1: LOOP
        SET SQLEOF = 0;
        --SET mSPQT  = 0 ;
        SET mPOLS  = '' ;

        FETCH FROM C1 INTO mCONO, mFACI, mSCHN, mHDPR ,mSTDT ;
        IF SQLEOF = 1 THEN
            LEAVE LP1;
        END IF;

       --SET mTPDT = 0;

       SET lSTYL = RTRIM(mHDPR)||'%';
       OPEN C2 USING mFACI,mSCHN,lSTYL;
       LP2: LOOP
          SET SQLEOF = 0;

          FETCH FROM C2 INTO lPLGR ;

          IF SQLEOF = 1 THEN
             LEAVE LP2;
          END IF;

          IF lPLGR IS NULL THEN
             SET lPLGR = '';
          END IF ;

          IF RTRIM(mPOLS) = '' THEN
             SET mPOLS = lPLGR ;
          ELSE
             SET mPOLS = RTRIM(mPOLS) || '/' || lPLGR ;
          END IF;

       END LOOP LP2;
       CLOSE C2;

       set mPOLS = RTRIM(mPOLS);

       INSERT INTO REPORT.CSHEET_SC_SEW
       VALUES (mCONO,mFACI,mSCHN,mHDPR,'MO',mSTDT,mPOLS);

    END LOOP LP1;
    CLOSE C1 ;

    SIGNAL SQLSTATE 'XGOOK';
END


在WINSQL 中  , 创建无错误, 执行也成功。 但是WINSQL 总是返回一些信息:

This command did not return data, and it did not return any rows
Column 2: CWB0111 - A buffer passed to a system call is too small to hold return data
Column 3: CWB0111 - A buffer passed to a system call is too small to hold return data
Column 4: CWB0111 - A buffer passed to a system call is too small to hold return data
String data right truncation.
String data right truncation.
String data right truncation.
Error: Invalid cursor state. (State:24000, Native Code: 7546)


有那位达人知道什么原因吗?

论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
2 [报告]
发表于 2008-12-22 13:00 |只看该作者
别用你那个工具,能不能直接把这段内容保存在文件里面,直接db2 -tvf去运行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP