IBM DB2 存储过程中的 While 循环以无限循环结束

While loop in IBM DB2 stored procedure endup in infinite looping

我是程序新手。有点我也得到了结果。但是我遇到了动态查询的问题。将查询存储在变量中并尝试使用游标执行。但是循环只有 select 第一个结果并无限执行。我找不到错误。我怎样才能清除错误?任何帮助将不胜感激。

我的程序是

CREATE PROCEDURE SPTEST1(IN tr_code INT, IN pen_type INT, IN pen_code INT, IN due_code INT, IN ord_dt DATE, IN finyr_cd INT, IN user_id varchar(50), IN server_ip varchar(100), OUT res INTEGER)
SPECIFIC sptest1
LANGUAGE SQL

P1:BEGIN
    DECLARE trcd INTEGER;
    DECLARE pentyp INTEGER;
    DECLARE pencd INTEGER;
    DECLARE duecd INTEGER;
    DECLARE orddt DATE;
    DECLARE finyrcd INTEGER;
    DECLARE userid VARCHAR(50);
    DECLARE serverip VARCHAR(100);
    DECLARE ls_pentype CHAR(1);
    DECLARE ls_voted CHAR(1);
    DECLARE li_crmonth INTEGER;
    DECLARE li_cryear INTEGER;
    DECLARE ls_adhoc CHAR(1);
    DECLARE ld_elgdt DATE;
    DECLARE li_duecode INTEGER;
    DECLARE li_headid INTEGER;
    DECLARE tr_whr varchar(500);
    DECLARE code_whr varchar(500);
    DECLARE sqlstmt varchar(1000);
    DECLARE EOF int DEFAULT 0;
    DECLARE v_duplicate INT DEFAULT 0;--
    DECLARE c_duplicate CONDITION FOR SQLSTATE '23505';
    DECLARE STMT VARCHAR(120);
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

    SET trcd = tr_code;
    SET pentyp = pen_type;
    SET pencd = pen_code;
    SET duecd = due_code;
    SET orddt = ord_dt;
    SET finyrcd = finyr_cd;
    SET userid = user_id;
    SET serverip = server_ip;
    SET ls_voted = 'V';

    IF duecd > 50 THEN
        SET ls_voted = 'C';
    END IF;
    FOR v_row AS <select query>
        DO
        SET ls_pentype = v_row.fmly_serv_oth_pen;
    END FOR;
    FOR date_month AS <select query>
        DO
        SET li_crmonth = date_month.credit_month;
        SET li_cryear = date_month.credit_year;
    END FOR;
    FOR adhoc_row AS <select query>
        DO
        SET ls_adhoc = adhoc_row.is_adhoc_due;
    END FOR;
    FOR elgdt_row AS <select query>
        DO
        SET ld_elgdt = elgdt_row.eligible_uptodt;
    END FOR;
    FOR head_row AS <select query>
        DO
        SET li_headid = head_row.head_id;
        SET li_duecode = duecd;
    END FOR;
    --portion for delete. have to enter
    P2:BEGIN
        DECLARE TRPOC CURSOR FOR <select query>

        OPEN TRPOC;
            FETCH FROM TRPOC INTO trcd;
            WHILE(SQLSTATE = '00000') DO
                insert into bg_run_test values(char(trcd));
                END WHILE;
        CLOSE TRPOC;        
    END P2;
END P1@

此处while循环在最后无限执行。我尝试插入 table 的地方。实际结果只有200个rows.But 插入不足

我认为您需要在 INSERT 语句之后的 WHILE 循环末尾添加一个 FETCH,才能成功跳出。

看到这个link,它准确地解释了这种情况。