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

#oracle #oracle10g #oracle-sqldeveloper

#Oracle #oracle10g #oracle-sqldeveloper

Вопрос:

 DECLARE
lv_basket_num NUMBER (3);
lv_created_date DATE;
lv_qty_num NUMBER(2);
lv_sub_num NUMBER(5,2);
lv_days_num NUMBER(3);
lv_shopper_num NUMBER(3) := 26;

BEGIN
SELECT idBasket, dtcreated, quantity, subtotal
INTO lv_basket_num, lv_created_date, lv_qty_num, lv_sub_num
FROM BB_BASKET
WHERE idShopper = lv_shopper_num
AND orderplaced= 0;

lv_days_num := SYSDATE-lv_created_date;
DBMS_OUTPUT.PUT_LINE(lv_basket_num||'*'||lv_created_date||'*'||lv_qty_num||'*'||lv_sub_num||'*'||lv_days_num);

END;
  

Комментарии:

1. В чем ваш вопрос? Что вы пробовали и какие у вас проблемы?

2. выше приведен код, в котором я должен изменить этот блок, чтобы использовать курсор для чтения и отображения информации для сохраненных корзин покупателя 26

3. Но что вы пытались достичь этого, и какие проблемы у вас есть с вашим измененным кодом? Показывая нам код, который предположительно работает (но выдает слишком много строк?) не объясняет, какая помощь вам нужна.

Ответ №1:

Это легко «преобразовать» SELECT в курсор:

 cursor cur_r is select ... <your query goes here>;
  

Затем вам нужно объявить переменную cursor (которая будет содержать результат, возвращаемый курсором) (вместо набора переменных, которые вы объявили сейчас), открыть курсор, извлечь из него, позаботиться о выходе из цикла, закрыть курсор. Слишком много действий, так почему бы вам не позволить Oracle сделать это за вас? Переключитесь на FOR цикл курсора.

Вот как:

 DECLARE
  lv_shopper_num NUMBER(3) := 26;
BEGIN
  for cur_r in (SELECT idBasket, dtcreated, quantity, subtotal,
                       sysdate - dtcreated as lv_days_num
                FROM BB_BASKET
                WHERE idShopper = lv_shopper_num
                  AND orderplaced = 0
               )
  loop               
    DBMS_OUTPUT.PUT_LINE(cur_r.idBasket ||'*'|| cur_r.dtcreated ||'*'|| 
                         cur_r.quantity ||'*'|| cur_r.subtotal  ||'*'|| lv_days_num);
  end loop;
END;