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