Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 如何创建局部变量来跟踪将输出是否为首次付款的ID_Plsql_Oracle11g - Fatal编程技术网

Plsql 如何创建局部变量来跟踪将输出是否为首次付款的ID

Plsql 如何创建局部变量来跟踪将输出是否为首次付款的ID,plsql,oracle11g,Plsql,Oracle11g,在这个项目上工作了一个星期,我觉得我离这个项目越来越近了。创建了一个PL/SQL块,该块将输出捐赠者的具体承诺、付款数量、付款日期和付款金额。我已经完成了大部分工作,它编译并生成所需的输出,但处理是否是相应行上的第一笔付款除外。我怎样才能创建一个变量来跟踪它,然后在块内测试它,而不破坏我已经做过的。下面是我现在得到的输出示例和我的PLSQL代码。谢谢 质押ID:106质押金额:$75每月支付:$0支付日期:2012年10月12日支付金额:$75 质押ID:109质押金额:$360每月支付:$12

在这个项目上工作了一个星期,我觉得我离这个项目越来越近了。创建了一个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

如您所见,“首次付款”应显示在前两行

我的代码:

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捐赠者一起完成。改变了你提供的几个街区,我得到了我想要的结果。非常感谢。初学者在这里,一定会寻找更多的帮助与未来的项目。艾伦