Plsql 如何创建局部变量来跟踪将输出是否为首次付款的ID
在这个项目上工作了一个星期,我觉得我离这个项目越来越近了。创建了一个PL/SQL块,该块将输出捐赠者的具体承诺、付款数量、付款日期和付款金额。我已经完成了大部分工作,它编译并生成所需的输出,但处理是否是相应行上的第一笔付款除外。我怎样才能创建一个变量来跟踪它,然后在块内测试它,而不破坏我已经做过的。下面是我现在得到的输出示例和我的PLSQL代码。谢谢 质押ID:106质押金额:$75每月支付:$0支付日期:2012年10月12日支付金额:$75 质押ID:109质押金额:$360每月支付:$12支付日期:2013年2月1日支付金额:$30 质押ID:109质押金额:$360每月支付:$12支付日期:2013年3月1日支付金额:$30 如您所见,“首次付款”应显示在前两行 我的代码:Plsql 如何创建局部变量来跟踪将输出是否为首次付款的ID,plsql,oracle11g,Plsql,Oracle11g,在这个项目上工作了一个星期,我觉得我离这个项目越来越近了。创建了一个PL/SQL块,该块将输出捐赠者的具体承诺、付款数量、付款日期和付款金额。我已经完成了大部分工作,它编译并生成所需的输出,但处理是否是相应行上的第一笔付款除外。我怎样才能创建一个变量来跟踪它,然后在块内测试它,而不破坏我已经做过的。下面是我现在得到的输出示例和我的PLSQL代码。谢谢 质押ID:106质押金额:$75每月支付:$0支付日期:2012年10月12日支付金额:$75 质押ID:109质押金额:$360每月支付:$12
DECLARE
pledge_id DD_PLEDGE.idpledge%TYPE;
pledge_amt DD_PLEDGE.pledgeamt%TYPE;
pay_months DD_PLEDGE.paymonths%TYPE;
pay_date DD_PAYMENT.paydate%TYPE;
pay_amt DD_PAYMENT.payamt%TYPE;
donor_id DD_PLEDGE.iddonor%TYPE;
CURSOR cur_pledges IS
SELECT pl.idpledge, pl.pledgeamt, pl.paymonths, pay.paydate,
pay.payamt, pl.iddonor FROM DD_PLEDGE pl JOIN DD_PAYMENT pay ON
pl.idpledge = pay.idpledge
WHERE pl.iddonor = 301
ORDER BY pl.idpledge, pay.paydate;
BEGIN
OPEN cur_pledges;
LOOP
FETCH cur_pledges INTO pledge_id, pledge_amt, pay_months, pay_date,
pay_amt, donor_id;
--possible test here for first payment
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || pledge_id || ' Pledge Amount: $'
|| pledge_amt || ' Monthly Payment: $' || pay_months
|| ' Pay Date: ' || pay_date || ' Amount Paid: $' || pay_amt);
EXIT WHEN cur_pledges%NOTFOUND;
END LOOP;
CLOSE cur_pledges;
END;
如果我正确理解你的问题。 您正在尝试查找由
donorid
完成的第一笔付款。
然后在光标中使用%ROWCOUNT找出该捐赠者有多少行。如果有多行,则不是他的第一次付款,否则是第一次付款
DECLARE
pledge_id DD_PLEDGE.idpledge%TYPE;
pledge_amt DD_PLEDGE.pledgeamt%TYPE;
pay_months DD_PLEDGE.paymonths%TYPE;
pay_date DD_PLEDGE.paydate%TYPE;
pay_amt DD_PLEDGE.payamt%TYPE;
donor_id DD_PLEDGE.iddonor%TYPE;
First_pay_flag varchar2(10); --Just set a flag
CURSOR cur_pledges IS
SELECT pl.idpledge, pl.pledgeamt, pl.paymonths, pl.paydate,payamt,iddonor
from DD_PLEDGE pl WHERE pl.iddonor = 007
ORDER BY pl.idpledge, pl.paydate;
BEGIN
OPEN cur_pledges;
LOOP
FETCH cur_pledges INTO pledge_id, pledge_amt, pay_months, pay_date,pay_amt, donor_id;
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || pledge_id || ' Pledge Amount: $'
|| pledge_amt || ' Monthly Payment: $' || pay_months
|| ' Pay Date: ' || pay_date || ' Amount Paid: $' || pay_amt);
IF CUR_PLEDGES%ROWCOUNT = 1 THEN
--DBMS_OUTPUT.PUT_LINE('First payment');
First_pay_flag := 'YES';
Else
-- DBMS_OUTPUT.PUT_LINE('Not the first payment.');
First_pay_flag :='NO';
END IF;
EXIT WHEN cur_pledges%NOTFOUND;
END LOOP;
CLOSE cur_pledges;
DBMS_OUTPUT.PUT_LINE(chr(10)||chr(13) || 'Is this a first payment ? ' || First_pay_flag );
END;
另外,我已经创建了一个表。更改它们你能试试这个吗?如果cur_%ROWCOUNT=1,那么dbms_output.put_line('first payment');很抱歉,我花了这么长时间才做出回应。您的方法以不同的方式工作。质押ID是变量,但可以以相同的方式应用。我仍然倾向于使用局部变量来跟踪事件。如果是“1”,那不是第一次付款吗?我想先试试你的方法。感谢您的帮助。如何为您的id赋值?我想您正在使用一个序列来生成质押id的值(即递增),如果是这样的话,我担心它不会起作用,因为捐赠者的质押id会随着他不断付款而不断增加。亨达尔,您是对的。这必须与IDR捐赠者一起完成。改变了你提供的几个街区,我得到了我想要的结果。非常感谢。初学者在这里,一定会寻找更多的帮助与未来的项目。艾伦