【问题标题】:How to insert into a table using stored procedures in DB2 using SQL?如何使用 SQL 使用 DB2 中的存储过程插入表?
【发布时间】: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 来比较并获得单个结果。

【问题讨论】:

    标签: sql stored-procedures cursor db2


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多