0

PLSQL は初めてで、ユーザー入力に基づいて 2 つのクエリのいずれかを実行する必要があります。ここまで作成した...

 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;

終わり; したがって、私が得ているエラーは、結果セット変数またはクエリの戻り値の型が一致しないことです。私のレコードまたはバスケットは、列が由来するテーブルと同じ行タイプを持つ必要があるため、取得できません。助けてください!

レコードの編集された Declare ステートメント... 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);
 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 Chapter 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 番目のカーソルでは、2 つの列のみを選択しています -

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

これらのカーソルは両方とも、同じタイプの変数にフェッチされますdd_pledge%ROWTYPE;

テーブルには5列または2列があります。テーブルの構造に基づいてdd_pledge、ベーステーブルと同じ数の列を返さないカーソルを変更してください。

ただし、異なるデータを選択する場合は、このために 2 つの別個の手順を作成するか、それぞれのカーソルに一致する異なるデータ型で 2 つのレコード変数を作成することをお勧めします。

于 2015-03-09T15:31:49.780 に答える