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

时间:2019-05-08 01:23:06

标签: oracle plsql database-cursor

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

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

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

...

实际输出:

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

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

...

1 个答案:

答案 0 :(得分:0)

因为,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)作为invoice_increment := invoice_row.sum_invoice - nvl(last_invoice_total_sum,0);应用于IF语句的ELSE部分