DBMS.OUTPUT.PUT_LINE печатает нулевое значение в первой итерации цикла - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь вывести значения приращения для каждой строки в наборе данных. По какой-то причине каждая строка, кроме первой, печатает числовое значение.

DECLARE CURSOR active_invoices_curs IS 
 SELECT vendor_id, invoice_date, sum(invoice_total) as sum_invoice
 FROM active_invoices
 GROUP BY vendor_id, invoice_date 
 ORDER BY vendor_id ASC; 
 last_vendor_id active_invoices.vendor_id%TYPE;
 last_invoice_total_sum active_invoices.invoice_total%TYPE;
 invoice_row active_invoices_curs%ROWTYPE; 
 invoice_increment number;
BEGIN
 FOR invoice_row in active_invoices_curs LOOP
  IF invoice_row.vendor_id != last_vendor_id OR invoice_row.vendor_id IS NULL THEN
   invoice_increment := invoice_row.sum_invoice;
  ELSE
   invoice_increment := invoice_row.sum_invoice - last_invoice_total_sum;
  END IF;
  last_vendor_id :=invoice_row.vendor_id;
  last_invoice_total_sum := invoice_row.sum_invoice;
  DBMS_OUTPUT.PUT_LINE('vendor '||invoice_row.vendor_id||'''s increment on '||invoice_row.invoice_date||' is: '||invoice_increment);
 End Loop;
End;

Ожидаемый результат:

прирост продавца 37 на 17 мая-14: 116

прирост продавца 37 на 19 мая-14: 108

...

Фактический объем производства:

Приращение продавца 37 на 17 мая-14:

Прирост продавца 37 на 19 мая-14: 108

...

1 Ответ

0 голосов
/ 08 мая 2019

Потому что last_invoice_total_sum не имеет начального значения, и, похоже, ваша первая итерация попадает в ELSE случай, и поэтому invoice_row.sum_invoice - last_invoice_total_sum; (, который назначен invoice_increment переменная ) дает null result.

Для инициализации этой переменной могут использоваться следующие методы:

  • last_invoice_total_sum active_invoices.invoice_total%TYPE := 0; может быть назначено в части объявления

или

  • last_invoice_total_sum := 0; до for loop

или

  • (last_invoice_total_sum,0) должны применяться в ELSE-части оператора IF как invoice_increment := invoice_row.sum_invoice - nvl(last_invoice_total_sum,0);
...