【问题标题】:Why am I receiving this error in PL/SQL为什么我在 PL/SQL 中收到此错误
【发布时间】:2015-06-29 23:04:10
【问题描述】:

我无法弄清楚为什么在运行查询时会出现以下错误。完成了几乎所有可能的搜索,因为它与我的问题有关。据我所知,代码很好。有什么想法吗?

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;

【问题讨论】:

  • DD_PLEDGEDD_PAYMENT中没有名为idpledge的列
  • @LucM:这太疯狂了。问题是对DBMS_OUTPUT.PUT_LINE 的调用中对idpledge 的引用。这是 PL/SQL 无法解析的标识符。

标签: oracle11g plsqldeveloper


【解决方案1】:

首先,格式化代码很有用。如果你不断地缩进,你会发现很多错误都会跳出来。

在这种情况下,第一个错误是您的 dbms_output.put_line 调用是在循环结束后发生的。那没有意义。假设您尝试为光标中返回的每一行编写一行输出,您希望 dbms_output 调用位于循环内。

第二个错误是您尝试在dbms_output 调用中引用的所有变量都不存在。例如,没有局部变量 idpledgepledgeamt。我的猜测是您打算引用 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;

【讨论】:

  • 这就是诀窍。在循环外错误地粘贴了错误版本的代码,DBMS 输出错误。欣赏有关语法缩进的建议。一点一点地学习。
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2018-05-13
  • 2018-06-22
  • 2016-01-01
  • 2012-04-26
相关资源
最近更新 更多