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,它准确地解释了这种情况。
我是程序新手。有点我也得到了结果。但是我遇到了动态查询的问题。将查询存储在变量中并尝试使用游标执行。但是循环只有 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,它准确地解释了这种情况。