Oracle11g 为什么我在PL/SQL中收到这个错误

Oracle11g 为什么我在PL/SQL中收到这个错误,oracle11g,plsqldeveloper,Oracle11g,Plsqldeveloper,我无法理解为什么在运行查询时会出现以下错误。做了几乎所有可能的搜索,因为它涉及到我的问题。据我所知,代码是好的。有什么想法吗 ORA-06550:第17行第42列: PLS-00201:必须声明标识符“IDplage” 我的代码: DECLARE f_payflag VARCHAR2(25); --flag for test condition CURSOR cur_pledges IS SELECT idpledge, pledgeamt, paymonths,

我无法理解为什么在运行查询时会出现以下错误。做了几乎所有可能的搜索,因为它涉及到我的问题。据我所知,代码是好的。有什么想法吗

ORA-06550:第17行第42列: PLS-00201:必须声明标识符“IDplage”

我的代码:

 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\u输出.put\u line
调用发生在循环结束后。那没有道理。假设您正试图为游标中返回的每一行编写一行输出,则希望
dbms\u输出
调用位于循环内部

第二个错误是,您试图在
dbms\u输出中引用的所有变量都不存在。例如,没有局部变量
idplage
warveeamt
。我猜您是想引用
rec\u idprovider
伪记录中的值。由于该伪记录只存在于循环中,因此这支持我的猜测,即您希望打印循环中的值。然后,在引用字段时需要显式使用伪记录

我猜你想要像这样的东西

 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;

没有名为
idplege
的列进入表
DD\u-credit
DD\u-PAYMENT
@LucM:这简直是胡说八道。问题是调用
DBMS\u OUTPUT.PUT\u LINE
时引用了
idplage
。这是PL/SQL无法解析的标识符。这就是诀窍。将DBMS输出错误地粘贴到循环外的错误版本的代码。请欣赏有关语法缩进的建议。一点一点地学习。