как разорвать цикл в базе данных db2 - PullRequest
0 голосов
/ 29 ноября 2018

Я создал 1 процедуру и использовал 1 курсор, используя этот курсор, который я использовал для цикла, но выборка цикла из курсора идет в бесконечный цикл.ниже мой код для процедуры.

    db2 "CREATE OR REPLACE PROCEDURE NEWEMPSELECT7 RESULT SETS 1 LANGUAGE SQL 
BEGIN 
DECLARE OUTRATE VARCHAR(50);
DECLARE C1 CURSOR for 
SELECT Emp_name FROM NEWEMP WHERE Emp_id=100;
OPEN C1;
LOOP
FETCH FROM C1 INTO OUTRATE;
CALL DBMS_OUTPUT.PUT_LINE(OUTRATE);
END LOOP;
CLOSE C1;
END" 

Результат идет в бесконечный цикл.даже я не могу использовать C1% NOTFOUND или любое ключевое слово, потому что db2 не поддерживает ни одно ключевое слово, чтобы нарушить правило.

, пожалуйста, предложите, как разорвать этот цикл в db2.

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы изучаете SQL PL, это поможет вам, если вы потратите время на изучение примеров программ IBM и приведение их в соответствие с вашей средой.

Вот тривиальный пример, основанный наВаш код, который работает с базой данных SAMPLE на Db2-LUW:

Обратите внимание, что существуют более элегантные способы кодирования таких циклов, в том числе использование оператора WHILE, использование переменных SQLSCODE / SQLSTATE и их сравнение и т. д.

--#SET TERMINATOR @

SET SERVEROUTPUT ON@

CREATE OR REPLACE PROCEDURE NEWEMPSELECT7 
RESULT SETS 1 LANGUAGE SQL 
BEGIN 
    DECLARE OUTRATE VARCHAR(50);
    DECLARE v_at_end INTEGER default 0;
    DECLARE not_found CONDITION FOR SQLSTATE '02000';
    DECLARE C1 CURSOR for 
        SELECT LASTNAME FROM EMPLOYEE WHERE Empno=100;
    DECLARE CONTINUE HANDLER FOR not_found  SET v_at_end = 1 ;

    OPEN C1;
    fetch_loop:
    LOOP
        FETCH FROM C1 INTO OUTRATE;
        IF v_at_end <>0 THEN LEAVE fetch_loop; END IF;
        CALL DBMS_OUTPUT.PUT_LINE(OUTRATE);
    END LOOP;
    CLOSE C1;
END
@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...