如何使用SQL在DB2中使用存储过程插入到表中?
我想知道如何使用SQL在DB2中使用存储过程插入到表中。 我创建了一个表,如下所示:如何使用SQL在DB2中使用存储过程插入到表中?,sql,stored-procedures,cursor,db2,Sql,Stored Procedures,Cursor,Db2,我想知道如何使用SQL在DB2中使用存储过程插入到表中。 我创建了一个表,如下所示: create table ADCLIBT.Itest (ITNBR CHAR(15) CCSID 65535 NOT NULL DEFAULT ''); create procedure ADCLIBT.itest1() LANGUAGE SQL BEGIN DECLARE itemno char(15); DECLARE END_TABLE INT DEFAULT 0; DE
create table ADCLIBT.Itest
(ITNBR CHAR(15) CCSID 65535 NOT NULL DEFAULT '');
create procedure ADCLIBT.itest1()
LANGUAGE SQL
BEGIN
DECLARE itemno char(15);
DECLARE END_TABLE INT DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '20000';
DECLARE c CURSOR FOR
select ITNBR from ADCLIBT.ITEMAT;
DECLARE CONTINUE HANDLER FOR not_found
SET END_TABLE = 1;
open c;
fetch from c into itemno;
WHILE END_TABLE = 0 DO
insert into ADCLIBT.ITEST
(ITNBR)
values
(select a.ITNBR from ADCLIBT.ITEMAT a where ITNBR=itemno GROUP BY a.ITNBR);
END WHILE;
Close c;
END;
此表包含项目列表。使用此列表,我想将各种其他字段插入到另一个表中。但是,举个例子,假设我只想使用游标逐个插入这些值。
我将存储过程编写如下:
create table ADCLIBT.Itest
(ITNBR CHAR(15) CCSID 65535 NOT NULL DEFAULT '');
create procedure ADCLIBT.itest1()
LANGUAGE SQL
BEGIN
DECLARE itemno char(15);
DECLARE END_TABLE INT DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '20000';
DECLARE c CURSOR FOR
select ITNBR from ADCLIBT.ITEMAT;
DECLARE CONTINUE HANDLER FOR not_found
SET END_TABLE = 1;
open c;
fetch from c into itemno;
WHILE END_TABLE = 0 DO
insert into ADCLIBT.ITEST
(ITNBR)
values
(select a.ITNBR from ADCLIBT.ITEMAT a where ITNBR=itemno GROUP BY a.ITNBR);
END WHILE;
Close c;
END;
这给了我一个无限循环。谁能告诉我如何停止无限循环并插入这些记录。我想使用游标,因为我想进一步使用itemno进行比较并获得单个结果。如果您正在打开游标,但在打开游标的同时未执行任何操作,则必须在游标的同时执行提取操作。这里是IBM文档中的一个示例
CREATE PROCEDURE sum_salaries(OUT sum INTEGER) LANGUAGE SQL
BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE p_sum INTEGER;
DECLARE p_sal INTEGER;
DECLARE c CURSOR FOR SELECT SALARY FROM EMPLOYEE;
SET p_sum = 0;
OPEN c;
FETCH FROM c INTO p_sal;
WHILE(SQLSTATE = '00000') DO
SET p_sum = p_sum + p_sal;
FETCH FROM c INTO p_sal;
END WHILE;
CLOSE c;
SET sum = p_sum;
END%
是的,如果你不这样做,你只是在第一排。谢谢你的及时回复。我试过这样做,但它仍然会产生一个无限循环。”开放式c;从c中提取到itemno中;当END_TABLE=0时,插入ADCLIBT.ITEST ITNBR值,从ADCLIBT.ITEMAT a中选择a.ITNBR,其中ITNBR=itemno由a.ITNBR分组;从c中提取到itemno中;结束时;关闭c;'大约有10公里的赛艇室。。。我不知道发生了什么。你能告诉我在所有记录都处理完之后,我应该使用continue处理程序还是EXIT处理程序离开表吗?终于明白了,怎么做。SQLSTATE“20000”的DECLARE not_found条件;给出了一个问题,所以我只使用了正常的continue`handler和notfound