1

SQL を使用して DB2 のストアド プロシージャを使用してテーブルに挿入する方法を知りたいと思っていました。次のようにテーブルを作成しました。

create table ADCLIBT.Itest
(ITNBR CHAR(15) CCSID 65535 NOT NULL DEFAULT '');

この表には項目のリストが含まれています。このリストを使用して、他のさまざまなフィールドを別のテーブルに挿入したいと考えています。しかし、たとえば、カーソルを使用してこれらの値を 1 つずつ挿入したいとします。次のようにストアドプロシージャを作成しました。

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さらに使用して単一の結果を比較して取得したいので、カーソルを使用したいと思います。

4

1 に答える 1

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%
于 2013-02-12T18:01:20.670 に答える