Mam problem z przetwarzaniem danych w poszukiwaniu pętli po zbiorczej zbierania.

OPEN my_cursor;
LOOP
FETCH my_cursor BULK COLLECT INTO var_t LIMIT 100000;
DBMS_OUTPUT.PUT_LINE('There is ' || var_t.COUNT || ' records found.');
EXIT WHEN my_cursor%NOTFOUND; 
FOR i IN var_t.FIRST .. var_t.LAST
LOOP
var_read_cnt := var_read_cnt + 1;
END LOOP;
END LOOP;
close my_cursor;
DBMS_OUTPUT.put_line('read/inserted : '|| var_read_cnt);

Wynik wygląda następująco

Znaleziono 100000 rekordów. Znaleziono 2397 rekordów. Manipulowany: 100000.

Część Fetch i luzem są poprawne, które rzeczywiście mam 100000 + 2397 rekordów. Ale nie jestem w stanie przetworzyć 2397 rekordów w pętli, ponieważ nie dostaję dla nich pętli. Jaki jest tutaj problem?

0
Jeremy 21 listopad 2020, 19:18

1 odpowiedź

Najlepsza odpowiedź

Twój stan exit jest nieprawidłowy.

EXIT WHEN my_cursor%NOTFOUND; 

Jeśli instrukcja fetch pobiera mniej wierszy niż jest dozwolona przez limit, %notfound będzie true. Ale nadal chcesz przetworzyć wiersze, które wyrywasz. Najprostszym podejściem jest zmiana kodu

EXIT WHEN var_t.count = 0;

Lub przesunąć stan exit do końca pętli, a nie na początku.

1
Justin Cave 21 listopad 2020, 16:36