Oracle Cursor Scripts错误

时间:2015-06-30 15:57:32

标签: oracle

我必须构造一个块来使用游标从两个表中提取信息。作为进一步的挑战,我必须确定拉动的第一项。我尝试使用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;  

1 个答案:

答案 0 :(得分:1)

您的代码中存在大量错误。如果你已经正确格式化了,你自己会发现其中的一些!

突然出现的事情:

  1. 您在最终的dbms_output.put_line中引用dd_pledge,但dd_pledge不是变量。我认为您打算使用rec_pled代替。
  2. 您在最终的dbms_output.put_line语句中引用pledID - 但这是在记录类型中定义的字段, NOT 已定义的变量。我想你可能打算使用rec_pled.pledid
  3. 您将光标的结果选择为rec_pled.type - 然而,&#34;键入&#34;不是type_pled定义中声明的字段!您的意思是rec_pled.idpledge吗?
  4. 您的最终dbms_output.put_line语句中有dd_pledge,payMonths - 逗号应该是句号:rec_pled.payMonths
  5. 您在关闭结果后输出结果。因为这只是一个记录变量,所以您只会输出查询中最后一行的结果。
  6. 为什么你没有为循环做游标?这照顾了你的退出并为你宣布一个记录。
  7. 无论如何,我认为您可以通过在查询中使用分析函数来实现结果,而不是需要使用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;