需要帮助 运行 游标 PLSQL 中的 2 个查询
Need help running 2 queries in a Cursor PLSQL
我是 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;
结束;
所以我得到的错误是 return 类型的结果集变量或查询不匹配。我不明白,因为我的记录或篮子的行类型应该与列来自的 table 相同。请帮忙!
已编辑记录的声明语句...
声明
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
;
在第一个光标中,您选择了 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;
。
table 有 5 列或 2 列。根据 table dd_pledge
的结构更改游标,它返回的列数与基础 table 这样做。
但是,如果您要选择不同的数据,我建议为此创建两个单独的过程,或者创建两个具有与各自游标匹配的不同数据类型的记录变量。
我是 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;
结束; 所以我得到的错误是 return 类型的结果集变量或查询不匹配。我不明白,因为我的记录或篮子的行类型应该与列来自的 table 相同。请帮忙!
已编辑记录的声明语句... 声明
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
;
在第一个光标中,您选择了 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;
。
table 有 5 列或 2 列。根据 table dd_pledge
的结构更改游标,它返回的列数与基础 table 这样做。
但是,如果您要选择不同的数据,我建议为此创建两个单独的过程,或者创建两个具有与各自游标匹配的不同数据类型的记录变量。