我正在尝试为数据集中的每一行输出增量值。由于某些原因,除第一行外的每一行都会打印一个数值。
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
...
答案 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部分