存储过程错误“预期时遇到 EOF

Posted

技术标签:

【中文标题】存储过程错误“预期时遇到 EOF【英文标题】:Stored Procedure Error "Encountered EOF when expecting 【发布时间】:2013-11-20 20:34:31 【问题描述】:

所以,我做了一些研究,从我能找到的类似问题中,我无法解决我的特定问题。我遇到了可怕的,

错误(35,18):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with

一些修复是查看您的代码并找到任何遗漏的分号。我的特定代码的问题在于,如果没有作为存储过程和 IN 参数的声明,则代码可以完美运行。我正在采用一个可行的程序,只是试图能够更改正在搜索的内容,而无需对全新的搜索进行硬编码。那有意义吗?

代码如下:`

CREATE OR REPLACE PROCEDURE testProcedure(var_Name IN varchar2)
IS
BEGIN
DECLARE
    var_Name newscores.name%TYPE;
    var_courseNo newscores.courseNo%Type;
    var_sectionNo newscores.sectionNo%Type;
    var_average grade2.average%TYPE;
    var_termscores gradepolicy.lettergrade%TYPE;
CURSOR AverageCursor is
    SELECT distinct n.name, n.courseNo, n.sectionNo, g2.average, gp.lettergrade
from newscores n, grade2 g2, gradepolicy gp
where n.stuNo = g2.stuNo
and n.courseNo = g2.courseNo
and n.sectionNo = g2.sectionNo
and g2.average < gp.upper_bound
and g2.average > gp.low_bound
and n.name = 'Randy Ballard'
and gp.classNo = g2.courseNo
and gp.sectionNo = g2.sectionNo;
BEGIN
OPEN AverageCursor;
LOOP

    FETCH AverageCursor
      INTO var_Name, var_courseNo, var_SectionNo, var_average, var_termscore;
    Exit when AverageCursor%NOTFOUND;

    dbms_output.put_line('Full Name'||' '||var_Name);
    dbms_output.put_line('Full Name'||' '||var_courseNo);
    dbms_output.put_line('Full Name'||' '||var_sectionNo);
    dbms_output.put_line('Full Name'||' '||var_average);
    dbms_output.put_line('Full Name'||' '||var_termscore);
END LOOP;
END testProcedure;
/

`

【问题讨论】:

【参考方案1】:

DECLARE 关键字和额外的 BEGIN 导致您的错误。试试这个:

CREATE OR REPLACE PROCEDURE testProcedure(p_name IN VARCHAR2)
IS
    var_Name newscores.name%TYPE;
    var_courseNo newscores.courseNo%Type;
    var_sectionNo newscores.sectionNo%Type;
    var_average grade2.average%TYPE;
    var_termscores gradepolicy.lettergrade%TYPE;
    CURSOR AverageCursor is
        SELECT distinct n.name, n.courseNo, n.sectionNo, g2.average, gp.lettergrade
          from newscores n, grade2 g2, gradepolicy gp
          where n.stuNo = g2.stuNo
            and n.courseNo = g2.courseNo
            and n.sectionNo = g2.sectionNo
            and g2.average < gp.upper_bound
            and g2.average > gp.low_bound
            and n.name = p_name
            and gp.classNo = g2.courseNo
            and gp.sectionNo = g2.sectionNo;
BEGIN
  OPEN AverageCursor;
  LOOP

      FETCH AverageCursor
        INTO var_Name, var_courseNo, var_SectionNo, var_average, var_termscore;
      Exit when AverageCursor%NOTFOUND;

      dbms_output.put_line('Full Name'||' '||var_Name);
      dbms_output.put_line('Full Name'||' '||var_courseNo);
      dbms_output.put_line('Full Name'||' '||var_sectionNo);
      dbms_output.put_line('Full Name'||' '||var_average);
      dbms_output.put_line('Full Name'||' '||var_termscore);
  END LOOP;
END testProcedure;
/

通常您在 ISBEGIN 关键字之间声明变量。

【讨论】:

这会产生以下错误:错误(1,1):PLS-00410:RECORD、TABLE 或参数列表中的重复字段是不允许的 @nmaybyte 这是因为您有与变量之一同名的过程参数。检查我编辑的答案,我已从程序中删除了参数。如果您希望它在那里,请更改其名称。 好吧,让我来挑选你的大脑。显然,您对这个主题的了解比我自己的要深得多。我相信您可以通过查看光标来判断,此过程会返回学生“Randy Ballard”正在参加的所有课程和所述课程的平均值。假设我希望能够使用该程序并允许用户随意更改搜索到的人的姓名。所以,不是 Randy Ballard,而是说我们要搜索 Jane Downer。我该怎么做?一开始我以为通过使用IN参数可以达到这个目的。 @nmaybyte 看看我编辑的答案 - 解决方案很简单 - 我在过程中添加了参数,而不是硬编码的“Randy Ballard”值,而是使用光标中的参数。这样,您可以获取不同用户的信息,具体取决于您传递给过程的参数。 非常感谢你。我不仅非常感谢您的知识,也非常感谢您简短及时的回应。

以上是关于存储过程错误“预期时遇到 EOF的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程报937错误

存储过程出现错误.关键字'ORDER'附近有语法错误.')'附近有语法错误.

oracle存储过程,如何获得详细的错误信息

关于存储过程返回游标的错误

sqlserver 存储过程错误

调用另一个存储过程后从存储过程返回错误结果