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);
应用
我正在尝试为数据集中的每一行输出增量值。由于某种原因,除第一行外的每一行都打印一个数值。
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);
应用