2017-02-05 1 views
-1

Мне нужна процедура sq sql, которая выводит все книги в базе данных, которые отвечают определенным критериям. Я запускаю его и выводя правильные значения, однако он всегда оставляет 1 набор значений. Например, если я запустил его с определенными ограничениями, которые вернут 10 книг, моя процедура покажет только 9. И это всегда будет книга, которая была бы в нижней части списка. Любая помощь приветствуется.PL/SQL курсор для цикла делает 1 слишком мало циклов

create or replace procedure which_titles(quant_limit number, price_limit number) as 
begin 
    for next_title in (select * 
         from title) 
    loop 
     IF next_title.qty_on_hand <= quant_limit 
     and next_title.title_price <= price_limit THEN 
     dbms_output.put_line(next_title.title_name || ' - ' || next_title.qty_on_hand || ' - ' || next_title.title_price); 
     END IF; 
    end loop; 
end; 
/
show errors 
+3

Утверждение 'IF' не требуется. Используйте 'select * from title, где qty_on_hand <= quant_limit и title_price <= price_limit', и посмотрите, сколько строк оно возвращает – GurV

+2

Почему вы не делаете фильтрацию внутри запроса курсора? Это было бы более эффективно, но вам было бы проще выполнить один и тот же запрос автономно и выяснить, почему он не делает то, что вы ожидаете. Вы увидите, что вы получите только 9 строк. Цикл не пропускает один, но ваш 'if' может быть исключен. Без данных и параметров мы не можем сказать, где ваша ошибка. –

+0

В этом цикле нет ничего, что могло бы вызвать такую ​​ошибку «по очереди»; поэтому я подозреваю, что в данных есть что-то, что вызывает эту проблему. Измените свой вопрос, чтобы включить образец данных, включая все соответствующие поля (QTY_ONHAND, TITLE_PRICE, TITLE_NAME). Благодарю. –

ответ

1

Согласно опубликованному коду. Кажется, все в порядке. Только у некоторых есть избыточность в коде, который был изменен. Кроме того, секрет в основном заключается в SELECT Query. Поэтому запустите запрос выбора с фактическим вводом вне процедуры. Вы определенно получите свой запрос.

Надеюсь, это поможет.

CREATE OR REPLACE 
procedure which_titles(
    quant_limit IN NUMBER, 
    price_limit IN NUMBER) 
AS 
BEGIN 
    FOR next_title IN 
    (SELECT   * 
    FROM title 
    WHERE title.qty_on_hand <= quant_limit 
    AND title.title_price <= price_limit 
) 
    LOOP 
    dbms_output.put_line(next_title.title_name || ' - ' || next_title.qty_on_hand || ' - ' || next_title.title_price); 
    END LOOP; 
END; 
/