【问题标题】:Stored Procedure Error "Encountered EOF when expecting存储过程错误“预期时遇到 EOF
【发布时间】: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;
/

`

【问题讨论】:

    标签: sql oracle stored-procedures stored-functions


    【解决方案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”值,而是使用光标中的参数。这样,您可以获取不同用户的信息,具体取决于您传递给过程的参数。
    • 非常感谢你。我不仅非常感谢您的知识,也非常感谢您简短及时的回应。
    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 2013-04-23
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多