如何使用 SQL 使用 DB2 中的存储过程插入表?
Posted
技术标签:
【中文标题】如何使用 SQL 使用 DB2 中的存储过程插入表?【英文标题】:How to insert into a table using stored procedures in DB2 using SQL? 【发布时间】:2013-02-12 17:52:45 【问题描述】:我想知道如何使用 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;
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
来比较并获得单个结果。
【问题讨论】:
【参考方案1】:您正在打开游标,但在此期间未提取,您必须在游标的同时进行提取。这是 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; WHILE END_TABLE = 0 DO 插入 ADCLIBT.ITEST (ITNBR) 值(从 ADCLIBT.ITEMAT a 中选择 a.ITNBR,其中 ITNBR=itemno GROUP BY a.ITNBR);从 c 获取到 itemno;结束;关闭 c;'大约有 10k 行 对不起...我不知道发生了什么。 你能告诉我在记录全部通过后我应该使用continue
处理程序还是EXIT
处理程序退出表?
终于明白了,怎么做。 DECLARE not_found CONDITION FOR SQLSTATE '20000'; was giving a problem , so I just used the normal
continue` 处理程序与 NOT FOUND
以上是关于如何使用 SQL 使用 DB2 中的存储过程插入表?的主要内容,如果未能解决你的问题,请参考以下文章