为什么我在 PL/SQL 中收到此错误
Why am I receiving this error in PL/SQL
我无法弄清楚为什么在 运行 查询时出现以下错误。几乎为此进行了所有可能的搜索,因为它与我的问题有关。据我所知,代码很好。有什么想法吗?
ORA-06550:第 17 行,第 42 列:
PLS-00201: 必须声明标识符 'IDPLEDGE'
我的代码:
DECLARE
f_payflag VARCHAR2(25); --flag for test condition
CURSOR cur_pledges IS
SELECT idpledge, pledgeamt, paymonths, paydate, payamt, iddonor
FROM DD_PLEDGE JOIN DD_PAYMENT
USING (IDPLEDGE)
WHERE idpledge = 302
ORDER BY idpledge, paydate;
BEGIN
FOR rec_iddonor IN cur_pledges LOOP
IF cur_pledges%ROWCOUNT = 1
THEN
f_payflag :='First Payment';
ELSE
f_payflag := NULL;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || idpledge ||
' Pledge Amount: $' || pledgeamt ||
'Monthly Payment: $'|| paymonths ||
'Pay Date: ' || paydate ||
' Amount Paid: $' || payamt ||
' ' || f_payflag);
END;
首先,格式化代码很有用。如果你一直缩进,你会发现很多错误都会跳出来。
在这种情况下,第一个错误是您的 dbms_output.put_line
调用发生在循环结束之后。那没有意义。假设您正在尝试为游标中返回的每一行写一行输出,您希望 dbms_output
调用在循环内。
第二个错误是您在 dbms_output
调用中尝试引用的所有变量都不存在。例如,没有局部变量 idpledge
或 pledgeamt
。我的猜测是您打算引用 rec_iddonor
伪记录中的值。由于该伪记录仅存在于循环内,这倾向于支持我的猜测,即您想从循环内打印值。然后,您需要在引用字段时显式使用伪记录。
我猜你想要类似
的东西
DECLARE
f_payflag VARCHAR2(25); --flag for test condition
CURSOR cur_pledges IS
SELECT idpledge, pledgeamt, paymonths, paydate, payamt, iddonor
FROM DD_PLEDGE JOIN DD_PAYMENT
USING (IDPLEDGE)
WHERE idpledge = 302
ORDER BY idpledge, paydate;
BEGIN
FOR rec_iddonor IN cur_pledges LOOP
IF cur_pledges%ROWCOUNT = 1
THEN
f_payflag :='First Payment';
ELSE
f_payflag := NULL;
END IF;
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || rec_iddonor.idpledge ||
' Pledge Amount: $' || rec_iddonor.pledgeamt ||
' Monthly Payment: $'|| rec_iddonor.paymonths ||
' Pay Date: ' || rec_iddonor.paydate ||
' Amount Paid: $' || rec_iddonor.payamt ||
' ' || f_payflag);
END LOOP;
END;
我无法弄清楚为什么在 运行 查询时出现以下错误。几乎为此进行了所有可能的搜索,因为它与我的问题有关。据我所知,代码很好。有什么想法吗?
ORA-06550:第 17 行,第 42 列: PLS-00201: 必须声明标识符 'IDPLEDGE'
我的代码:
DECLARE
f_payflag VARCHAR2(25); --flag for test condition
CURSOR cur_pledges IS
SELECT idpledge, pledgeamt, paymonths, paydate, payamt, iddonor
FROM DD_PLEDGE JOIN DD_PAYMENT
USING (IDPLEDGE)
WHERE idpledge = 302
ORDER BY idpledge, paydate;
BEGIN
FOR rec_iddonor IN cur_pledges LOOP
IF cur_pledges%ROWCOUNT = 1
THEN
f_payflag :='First Payment';
ELSE
f_payflag := NULL;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || idpledge ||
' Pledge Amount: $' || pledgeamt ||
'Monthly Payment: $'|| paymonths ||
'Pay Date: ' || paydate ||
' Amount Paid: $' || payamt ||
' ' || f_payflag);
END;
首先,格式化代码很有用。如果你一直缩进,你会发现很多错误都会跳出来。
在这种情况下,第一个错误是您的 dbms_output.put_line
调用发生在循环结束之后。那没有意义。假设您正在尝试为游标中返回的每一行写一行输出,您希望 dbms_output
调用在循环内。
第二个错误是您在 dbms_output
调用中尝试引用的所有变量都不存在。例如,没有局部变量 idpledge
或 pledgeamt
。我的猜测是您打算引用 rec_iddonor
伪记录中的值。由于该伪记录仅存在于循环内,这倾向于支持我的猜测,即您想从循环内打印值。然后,您需要在引用字段时显式使用伪记录。
我猜你想要类似
的东西 DECLARE
f_payflag VARCHAR2(25); --flag for test condition
CURSOR cur_pledges IS
SELECT idpledge, pledgeamt, paymonths, paydate, payamt, iddonor
FROM DD_PLEDGE JOIN DD_PAYMENT
USING (IDPLEDGE)
WHERE idpledge = 302
ORDER BY idpledge, paydate;
BEGIN
FOR rec_iddonor IN cur_pledges LOOP
IF cur_pledges%ROWCOUNT = 1
THEN
f_payflag :='First Payment';
ELSE
f_payflag := NULL;
END IF;
DBMS_OUTPUT.PUT_LINE('Pledge ID: ' || rec_iddonor.idpledge ||
' Pledge Amount: $' || rec_iddonor.pledgeamt ||
' Monthly Payment: $'|| rec_iddonor.paymonths ||
' Pay Date: ' || rec_iddonor.paydate ||
' Amount Paid: $' || rec_iddonor.payamt ||
' ' || f_payflag);
END LOOP;
END;