Проблема массового сбора Oracle - PullRequest
2 голосов
/ 05 октября 2010

У меня небольшая проблема с куском массового сбора SQL, с которым я надеялся, что вы сможете помочь.

Со следующим кодом:

declare
    cursor c1
    is
    select customer,product
    from products;

    type type_cust is table of products.customer%type;
    type type_prod is table of products.product%type;

    v_array_cust    type_cust;
    v_array_prod    type_prod;
begin
    open c1;
    loop
        fetch c1 
        into v_array_cust, v_array_prod
        limit 1000;

        exit when c1%notfound;

        for i in 1..v_array_cust.count
        loop
            --Do some processing here.
        end loop;
    end loop;
end;
/

Курсор c1 возвращает 53166 строк.

Однако код обрабатывает 53000 строк и затем завершается. Кажется, что при получении последних 166 записей возникает какая-то ошибка.

Будет ли выборка возвращать% notfound, если будет найдено менее 1000 записей? Должен ли я переместить выход в конец цикла? (Я собираюсь попробовать это, но глубоко в куске кода требуется 3 часа, чтобы добраться до точки сбоя.)

Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 05 октября 2010

Ладно, лучше погуглив, чем я уже дал, я ответил, что не стоит использовать% notfound с лимитом.

Проверьте здесь для объяснения.

4 голосов
/ 06 октября 2010

Только для справки, вот одно простое изменение, чтобы код работал правильно:

open c1;
loop
    fetch c1 
    into v_array_cust, v_array_prod
    limit 1000;

    -- the count will be 0 if no rows were found, so this loop will do nothing.
    for i in 1..v_array_cust.count
    loop
        --Do some processing here.
    end loop;

    -- exit now if the last fetch got the last set of rows
    exit when c1%notfound;
end loop;
close c1;
1 голос
/ 05 октября 2010

Извините за то, что сказал это, но, черт возьми! курсоры! ... то, как вы это написали, кажется, вы пришли из линейного программирования. Рассматривали ли вы решение на основе множества для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...