我正在学习LOOPS,唱片和收藏。我有一个计划,我正在为捐款人承诺金额1500美元的付款时间表。 PL / SQL程序运行24个月的付款计划,从ID为“111”的捐赠者的捐赠表中检索余额,显示每笔付款的付款金额,并在每次付款后显示24笔付款与BALANCE到ZERO余额。我已经在下面包含了表格信息,但是,我只是将该表中的一个值插入到我的集合中,然后对其进行计算。这是付款的理想结果:
匿名阻止完成
支付#:1到期时间:10/01/2012 Amt:$ 62.50 Bal:$ 1,437.50
支付#:2到期日:11/01/2012 Amt:$ 62.50 Bal:$ 1,375.00
...支付#:23截止日期:08/01/2014 Amt:62.50美元Bal:62.50美元
支付#:24截止日期:09/01/2014 Amt:62.50美元Bal:$ .00
该计划的开始日期为“01-OCT-2012”,24笔付款的付款金额为62.50。
我正在使用RECORD和LOOP来执行此程序,但它无效。
我仍然可以在LOOP和MONTH中使用一些关于PAYMENT BALANCE迭代的GUIDANCE,仅为NOV增加1个月并在整个过程中使用它。这就是我需要将集合部分添加到我的编码中并为LOOP调用这些值的地方。
这是我更新的编码更简单,但不确定BALANCE计算进入LOOP,并且付款日期从01年10月1日到01 NOV并将其用作日期。我还在学习收藏品。
SET SERVEROUTPUT ON
DECLARE
payment_num NUMBER(2) := 0;
d_loop_count NUMBER(2) := 24;
due_date DATE;
payment_amt NUMBER(8, 2) := 62.50;
donation_balance NUMBER(8,2);
pledgeamt NUMBER(8,2) := 1500;
---This pledgeamt is not correct, involved in Collection called value from TABLE
start_date DATE := '01-OCT-2012';
BEGIN
/*
SELECT pledgeamt INTO donation_balance
FROM dd_pledge
WHERE idpledge = '111'; --111 has a pledge amount of $1500
*/
FOR i IN 1..d_loop_count
LOOP
payment_num :=payment_num + 1;
due_date := add_months(start_date, 1);
donation_balance := (pledgeamt - payment_amt);
dbms_output.put_line
(
'Pay #: ' || payment_num
|| ' ' || 'Due: ' || due_date
|| ' ' || 'Amt: ' || payment_amt
|| ' ' || 'Bal: '|| donation_balance
);
END LOOP;
END;
/
这是线轴给我的。它正在出现,但需要在LOOP迭代和捐款支付余额的计算以及支付顺序的MONTH倒计时方面获得更多帮助。
anonymous block completed
Pay #: 1 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 2 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 3 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 4 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
...Pay #: 20 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 21 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 22 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 23 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
Pay #: 24 Due: 01-NOV-12 Amt: 62.5 Bal: 1437.5
以下是我将用于将捐款表中的余额输入到LOOP中的表格信息。
表dd_pledge信息是
IDPLEDGE NUMBER(5,0) No 1
IDDONOR NUMBER(4,0) Yes 2
PLEDGEDATE DATE Yes 3
PLEDGEAMT NUMBER(8,2) Yes 4
IDPROJ NUMBER(5,0) Yes 5
IDSTATUS NUMBER(2,0) Yes 6
WRITEOFF NUMBER(8,2) Yes 7
PAYMONTHS NUMBER(3,0) Yes 8
CAMPAIGN NUMBER(4,0) Yes 9
FIRSTPLEDGE CHAR(1 BYTE) Yes 10
111 ROW equals:
IDPLEDGE IDDONOR PLEDGEDATE PLEDGEAMT
111 306 01-MAR-13 1500
etc...
504 20 0 756 Y
以下是关于集合,记录的部分,这是我正在努力让其他人了解有关PL / SQL集合的更多信息。 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#CHDBHJEI
答案 0 :(得分:0)
以下是基于现有Oracle emp表的示例 - 抱歉没有时间深入挖掘您的代码并且您没有发布任何样本数据。发布问题时始终创建表格和数据。此外,我同意tbone,除非您正在学习PL / SQL尽可能使用SQL。复制/粘贴以查看结果。不要像在代码中那样在循环中使用SELECT ... INTO。
DECLARE
CURSOR c1 IS SELECT * FROM scott.emp;
TYPE EmpTabTyp IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
BEGIN
OPEN c1;
LOOP
i := i + 1;
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
--dbms_output.put_line(emp_tab(i).empno);
END LOOP;
CLOSE c1;
END;
/
DECLARE
TYPE EmpTabTyp IS TABLE OF scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM scott.emp;
BEGIN
-- Method 1 - the BULK COLLECT is faster --
SELECT * BULK COLLECT INTO emp_tab FROM scott.emp;
dbms_output.put_line('BULK example:'||chr(13));
-- Display values in emp_tab --
--FOR i IN emp_tab.first .. emp_tab.last LOOP -- or use COUNT method as below --
FOR i IN 1 .. emp_tab.COUNT LOOP
dbms_output.put_line(i||' '||emp_tab(i).empno||' '||emp_tab(i).ename);
END LOOP;
dbms_output.put_line(chr(13)||'END BULK example'||chr(13));
-- Method 2 - Loop --
FOR e_rec IN c1 LOOP
i:= i+1;
emp_tab(i).empno:= e_rec.empno;
dbms_output.put_line(i||' '||emp_tab(i).empno);
END LOOP;
END;
/
答案 1 :(得分:0)
SET SERVEROUTPUT ON
DECLARE
payment_num NUMBER(2) := 0;
d_loop_count NUMBER(2) := 24;
payment_amt NUMBER(8, 2);
donation_balance NUMBER(8,2);
v_pledgeamt NUMBER(8,2);
start_date DATE := '01-OCT-2012';
due_date DATE;
v_due_date VARCHAR2(15);
BEGIN
SELECT pledgeamt INTO v_pledgeamt FROM dd_pledge
WHERE idpledge = &idpledge;
payment_amt := v_pledgeamt / d_loop_count;
due_date := start_date;
donation_balance := (v_pledgeamt - payment_amt);
FOR i IN 1..d_loop_count
LOOP
payment_num :=payment_num + 1;
v_due_date := TO_CHAR(due_date,'mm/dd/yyyy');
due_date := add_months(due_date, 1);
dbms_output.put_line
(
'Pay #: ' || payment_num
|| ' ' || 'Due: ' || v_due_date
|| ' ' || 'Amt: ' || payment_amt
|| ' ' || 'Bal: '|| to_char(donation_balance, '$9999.99')
);
donation_balance := (donation_balance - payment_amt);
END LOOP;
END;
/
答案 2 :(得分:0)
对于正确的日期和支付金额/月:
DECLARE
payment_num NUMBER(2) := 0;
d_loop_count NUMBER(2) := 24; --PAYMONTHS
payment_amt NUMBER(8, 2);
donation_balance NUMBER(8,2);
v_pledgeamt NUMBER(8,2);
start_date DATE := '01-OCT-2012';
due_date DATE;
v_due_date VARCHAR2(15);
BEGIN
SELECT pledgeamt, PAYMONTHS, PLEDGEDATE INTO v_pledgeamt, d_loop_count, start_date FROM dd_pledge
WHERE idpledge = &idpledge;
--d_loop_count := PAYMONTHS;
--start_date := PLEDGEDATE;
payment_amt := v_pledgeamt / d_loop_count;
due_date := start_date;
donation_balance := (v_pledgeamt - payment_amt);
FOR i IN 1..d_loop_count
LOOP
payment_num :=payment_num + 1;
v_due_date := TO_CHAR(due_date,'mm/dd/yyyy');
due_date := add_months(due_date, 1);
dbms_output.put_line
(
'Pay #: ' || payment_num
|| ' ' || 'Due: ' || v_due_date
|| ' ' || 'Amt: ' || payment_amt
|| ' ' || 'Bal: '|| to_char(donation_balance, '$9999.99')
);
donation_balance := (donation_balance - payment_amt);
END LOOP;
END;