DBMS.OUTPUT.PUT_LINE 在循环的第一次迭代中打印空值

DBMS.OUTPUT.PUT_LINE prints null value in first iteration of loop

我正在尝试为数据集中的每一行输出增量值。由于某种原因,除第一行外的每一行都打印一个数值。

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 在 2014 年 5 月 17 日的增量为:116

供应商 37 在 2014 年 5 月 19 日的增量为:108

...

实际输出:

供应商 37 在 2014 年 5 月 17 日的增量为:

供应商 37 在 2014 年 5 月 19 日的增量为:108

...

因为 last_invoice_total_sum 没有初始值,而且你的第一次迭代似乎属于 ELSE 的情况,所以 invoice_row.sum_invoice - last_invoice_total_sum;( 被分配给 invoice_increment 变量) 给出 null 结果。

要初始化该变量,可以使用以下方法:

  • last_invoice_total_sum active_invoices.invoice_total%TYPE := 0;可能 在声明部分赋值

  • last_invoice_total_sum := 0;for loop
  • 之前

  • (last_invoice_total_sum,0) 在 IF 语句的 ELSE 部分中作为 invoice_increment := invoice_row.sum_invoice - nvl(last_invoice_total_sum,0);
  • 应用