0

我是 PLSQL 的新手,需要根据用户输入运行两个查询之一。到目前为止,我创建了这个......

 Set serveroutput on;
 Declare
 cv_prod SYS_REFCURSOR;
 rec_d dd_pledge%ROWTYPE;
 rec_s dd_pledge%ROWTYPE;
 userinput varchar(1):='&Enter';


 Begin
 If lower(userinput)= 'd' THEN
     OPEN cv_prod FOR Select dd_payment.idpay, dd_pledge.idpledge, dd_pledge.iddonor, dd_payment.paydate, pledgeamt/paymonths 
       from dd_pledge
         join dd_payment
           on dd_pledge.idpledge=dd_payment.idpledge
             where iddonor=308
               order by idpay, dd_pledge.iddonor;
   LOOP
     FETCH cv_prod into rec_d;
       EXIT WHEN cv_prod%NOTFOUND;
         --DBMS_OUTPUT.PUT_LINE(rec_d);
   END LOOP;
 ELSIF lower(userinput)= 's' THEN
     OPEN cv_prod FOR Select dd_pledge.idpledge, sum(pledgeamt/paymonths)
       from dd_pledge
         join dd_payment
           on dd_pledge.idpledge=dd_payment.idpledge
             where iddonor=308
               group by dd_pledge.idpledge;
     LOOP
       FETCH cv_prod into rec_s;
         EXIT WHEN cv_prod%NOTFOUND;
           --DBMS_OUTPUT.PUT_LINE(rec_s);
     END LOOP;
 END IF;

结尾; 所以我得到的错误是结果集变量或查询的返回类型不匹配。我不明白,因为我的记录或篮子应该与列所来自的表具有相同的行类型。请帮忙!

为记录编辑了声明声明...声明

 cv_prod SYS_REFCURSOR;
 type rec_d is Record(idpay dd_payment.idpay%type, idpledge dd_pledge.idpledge%type, iddonor dd_pledge.iddonor%type, paydate dd_payment.paydate%type);
 cv prod rec_d;
 type rec_s is Record(pledge dd_pledge.idpledge%type)
 cv_prod rec_s
 rec_s dd_pledge%ROWTYPE;
 userinput varchar(1):='&Enter';

必须接近......新代码。--捐助者 ID = 308 /* Lucas Gutknecht 第 4 章 */

Set serveroutput on;
 Declare
 cv_prod SYS_REFCURSOR;
 type rec_d is Record(idpay dd_payment.idpay%type, idpledge dd_pledge.idpledge%type, iddonor dd_pledge.iddonor%type, paydate dd_payment.paydate%type);
 rec_d1 rec_d;
 type rec_s is Record(pledge dd_pledge.idpledge%type);
rec_s1 rec_s;
 userinput varchar(1):='&Enter';


 Begin
 If lower(userinput)= 'd' THEN
     OPEN cv_prod FOR Select dd_payment.idpay, dd_pledge.idpledge, dd_pledge.iddonor, dd_payment.paydate /*pledgeamt/paymonths*/ 
       from dd_pledge
         join dd_payment
           on dd_pledge.idpledge=dd_payment.idpledge
             where iddonor=308
               order by idpay, dd_pledge.iddonor;
   LOOP
     FETCH cv_prod into rec_d1;
       EXIT WHEN cv_prod%NOTFOUND;
         --DBMS_OUTPUT.PUT_LINE(rec_d);
   END LOOP;
 ELSIF lower(userinput)= 's' THEN
     OPEN cv_prod FOR Select dd_pledge.idpledge, /*sum(pledgeamt/paymonths)*/
       from dd_pledge
         join dd_payment
           on dd_pledge.idpledge=dd_payment.idpledge
             where iddonor=308
               group by dd_pledge.idpledge;
     LOOP
       FETCH cv_prod into rec_s1;
         EXIT WHEN cv_prod%NOTFOUND;
           --DBMS_OUTPUT.PUT_LINE(rec_s);
     END LOOP;
 END IF;
 End

;

4

1 回答 1

1

在第一个光标中,您选择 5 列 -

OPEN cv_prod FOR Select dd_payment.idpay, dd_pledge.idpledge, dd_pledge.iddonor, dd_payment.paydate, pledgeamt/paymonths

在第二个光标中,您只选择 2 列 -

OPEN cv_prod FOR Select dd_pledge.idpledge, sum(pledgeamt/paymonths)

这两个游标都被提取到相同类型的变量中,即dd_pledge%ROWTYPE;.

该表有 5 列或 2 列。根据表的结构dd_pledge更改未返回与基表相同列数的游标来执行此操作。

但是,如果您选择不同的数据,我建议为此创建两个单独的过程,或者创建两个具有与其各自光标匹配的不同数据类型的记录变量。

于 2015-03-09T15:31:49.780 回答