【问题标题】:While loop in IBM DB2 stored procedure endup in infinite loopingIBM DB2 存储过程中的 While 循环以无限循环结束
【发布时间】:2015-12-31 05:54:49
【问题描述】:

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

我的程序是

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循环在最后一次无限执行。我尝试在表格中插入的位置。实际上结果只有 200 行。但是插入不足。

【问题讨论】:

  • 旁注:如果可能,请避免 SQL 中的循环,尤其是在发出查询和语句时。可以将整个事情写成一个包含SELECTs 及其数据的INSERT 语句。

标签: stored-procedures while-loop db2


【解决方案1】:

我认为您需要在 INSERT 语句之后的 WHILE 循环末尾添加一个额外的 FETCH,以使其成功中断。

请参阅此link,它准确地解释了这种情况。

【讨论】:

  • 非常感谢..这就像一个魅力..我花了大约 2 天的时间来回答这个问题..再次感谢您
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2015-06-25
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多