我必须构造一个块来使用游标从两个表中提取信息。作为进一步的挑战,我必须确定拉动的第一项。我尝试使用IF语句来解决这个问题。它在几个方面出错,我不知道我做错了什么。不是每个人都要求答案,只是推动让我再次行动。谢谢。这是我到目前为止编写的代码:
DECLARE
CURSOR cur_pled IS
SELECT dd_pledge.idpledge, dd_pledge.pledgeamt, dd_pledge.paymonths, dd_payment.paydate, dd_payment.payamt
FROM dd_pledge, dd_payment
WHERE dd_payment.idpledge = dd_pledge.idpledge AND
dd_pledge.idpledge = 104
ORDER BY dd_pledge.idpledge, dd_payment.paydate;
TYPE type_pled IS RECORD
(pledID dd_pledge.idpledge%TYPE,
pledAmt dd_pledge.pledgeamt%TYPE,
payMonths dd_pledge.paymonths%TYPE,
payDate dd_payment.paydate%TYPE,
payAmt dd_payment.payamt%TYPE);
rec_pled type_pled;
lv_id_num dd_pledge.idpledge%TYPE := 0;
BEGIN
OPEN cur_pled;
LOOP
FETCH cur_pled INTO rec_pled;
EXIT WHEN cur_pled%NOTFOUND;
IF rec_pled.type <> lv_id_num THEN
DBMS_OUTPUT.PUT_LINE('First Payment');
ELSE DBMS_OUTPUT.PUT_LINE('Other Payment');
END IF;
END LOOP;
CLOSE cur_pled;
DBMS_OUTPUT.PUT_LINE(pledID || ' ' || dd_pledge.pledgeamt || ' ' ||
dd_pledge,payMonths || ' ' || dd_payment.payDate || ' ' ||
dd_payment.payAmt);
END;
答案 0 :(得分:1)
您的代码中存在大量错误。如果你已经正确格式化了,你自己会发现其中的一些!
突然出现的事情:
dd_pledge
,但dd_pledge
不是变量。我认为您打算使用rec_pled
代替。pledID
- 但这是在记录类型中定义的字段, NOT 已定义的变量。我想你可能打算使用rec_pled.pledid
rec_pled.type
- 然而,&#34;键入&#34;不是type_pled定义中声明的字段!您的意思是rec_pled.idpledge
吗?dd_pledge,payMonths
- 逗号应该是句号:rec_pled.payMonths
无论如何,我认为您可以通过在查询中使用分析函数来实现结果,而不是需要使用PL / SQL来完成工作:
SELECT plg.idpledge,
plg.pledgeamt,
plg.paymonths,
pay.paydate,
pay.payamt,
case when row_number() over (partition by plg.idpledge, pay.paydate) = 1 then 'First Payment'
else 'Other Payment'
end type_of_payment
FROM dd_pledge plg
inner join dd_payment pay on (pay.idpledge = plg.idpledge)
--WHERE plg.idpledge = 104 -- add back in if you really need to do it for a single id
ORDER BY plg.idpledge, pay.paydate;