互联网服务数据库db2 v9.7

DB2 FOR循环问题

ERROR [24501] [IBM][DB2/NT64] SQL0501N  The cursor specified in a FETCH statement or CLOSE statement is not open or a cursor variable in a cursor scalar function reference is not open.只循环一次就报错。代码如下:FOR FLOWS     &...显示全部

ERROR [24501] [IBM][DB2/NT64] SQL0501N  The cursor specified in a FETCH statement or CLOSE statement is not open or a cursor variable in a cursor scalar function reference is not open.

只循环一次就报错。

代码如下:

FOR FLOWS

         as ( SELECT P.PROC_NAME FROM PA_CONTROL_FLOW F, PA_CONTROL_FLOW_PROC P

                WHERE     F.NODE_ID = P.NODE_ID

                      AND F.PRE_STATUS = V_PERIOD_STATUS

                      AND P.PROC_STATUS = '1'

                      AND (F.LEGAL_ORG IS NULL OR F.LEGAL_ORG = I_LEGAL_ORG)

             ORDER BY PROC_SEQ)

      DO

         IF FLOWS.PROC_NAME IS NOT NULL

         THEN

            IF I_TARGET_TYPE_CODE IS NULL OR I_TARGET_TYPE_CODE = '01'

            THEN

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

              SET V_DEL_SQL = 'CALL PAMS_PROD.'||REPLACE(FLOWS.PROC_NAME,'.','$')||'('''||I_PERIOD_CODE||''',''01'','||I_ASSESS_ID||','''||I_LEGAL_ORG||''','''||I_FLOW_PROCESS_ID||''')';--,'''||O_ERR_MESSAGE||'''

              EXECUTE IMMEDIATE V_DEL_SQL;

            END IF;

            IF I_TARGET_TYPE_CODE IS NULL OR I_TARGET_TYPE_CODE = '02'

            THEN

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

              SET V_DEL_SQL = 'CALL PAMS_PROD.'||REPLACE(FLOWS.PROC_NAME,'.','$')||'('''||I_PERIOD_CODE||''',''02'','||I_ASSESS_ID||','''||I_LEGAL_ORG||''','''||I_FLOW_PROCESS_ID||''')';--,'''||O_ERR_MESSAGE||'''

              EXECUTE IMMEDIATE V_DEL_SQL;

            END IF;

            

         END IF;

         

      END FOR;

收起
参与7

返回dongxincun的回答

dongxincundongxincun软件开发工程师YTEC

试一下常规的声明游标然后打开再FETCH变量看看

DECLARE at_end INT DEFAULT 0;

DECLARE vItemCode VARCHAR(20);

DECLARE cur CURSOR WITH RETURN FOR S2;

DECLARE CONTINUE HANDLER FOR not found SET at_end = 1;

  SET vSqlText2 = 'SELECT SETL_IND_CD FROM REF.TR_AOASETL_IND ORDER BY SETL_IND_CD';

  PREPARE S2 FROM vSqlText2;

  OPEN cur;

    SET at_end = 0;

    CUR_LOOP:

    LOOP

      FETCH cur INTO vItemCode;

      IF (at_end = 1) THEN LEAVE CUR_LOOP; END IF;

      SET vSqlText = 'INSERT INTO DM.TM_AOASETL_IND_DAY(TM_INTRVL_CD,CALL_DT,SETL_IND_CD,SETL_IND_VAL) '

                   ||'SELECT '||CHAR(vStatDay)||',CALL_DT,'''||vItemCode||''',COL_'||vItemCode||' '

                   ||'  FROM SESSION.PRO_TM_AOASETL_IND_DAY ';

      PREPARE S1 FROM vSqlText;

      EXECUTE S1;

      GET DIAGNOSTICS vRowCount = ROW_COUNT;

    END LOOP;

  CLOSE cur;   

互联网服务 · 2016-08-07
浏览2147
  • execute 这种方式呀,但我需要从一个表中取出数据,然后再做逻辑处理的
    2016-08-09

回答者

dongxincun
软件开发工程师YTEC

dongxincun 最近回答过的问题

回答状态

  • 发布时间:2016-08-07
  • 关注会员:2 人
  • 回答浏览:2147
  • X社区推广