令人沮丧的 PL/SQL 错误...PLS-00103

Posted

技术标签:

【中文标题】令人沮丧的 PL/SQL 错误...PLS-00103【英文标题】:A frustrating PL/SQL Error...PLS-00103 【发布时间】:2015-03-02 15:51:10 【问题描述】:

我一直在为我的一门课程学习 PL/SQL,但我很难调试 PLS-00103 错误。我已经在线搜索了错误,但我找到的解决方案不一定足够具体来解决我的问题。也许我只是需要多看几眼。您将在下面找到我的代码和相应的错误消息。先感谢您!示例输出低于错误。

代码:

create or replace procedure pro_AvgGrade as

min_avg NUMBER := 100;
max_avg NUMBER := 0;
bins NUMBER := 0;
binlen NUMBER := 10;
temp NUMBER := 0;
binprint NUMBER := 0;

CURSOR grades IS SELECT AvgGrade FROM (SELECT DeptName, AVG(GradeAsPercentage) AS AvgGrade FROM Department JOIN Course on Department.DeptId = Course.DeptId JOIN Offering on Course.CourseId = Offering.CourseId JOIN Registration on Offering.OfferingId = Registration.OfferingId GROUP BY DeptName ORDER BY DeptName ASC);

grade_tuple grades%ROWTYPE;

BEGIN
    open grades;

    for grade_tuple in grades loop
        temp := grade_tuple.AvgGrade;
        if (temp>max) then
            max_avg := temp;
        elsif (temp<min) then
            min_avg := temp;
        end if;
    end loop;

    close grades;

    binprint := min_avg;
    bins := max_avg-min_avg;
    bins := bins/binlen;
    dbms_output.put_line('DeptName       AvgGrade:       ');

    LOOP
        dbms_output.put('>' || min_avg || ',' || '<=');
        min_avg := binlen+10;
        dbms_output.put(min_avg);
        dbms_output.put('     ');
        i := i+1;
        EXIT WHEN i>bins;
    END LOOP;

END pro_AvgGrade;
/


begin
pro_AvgGrade;
end;
/

错误:

    LINE/COL ERROR
-------- -----------------------------------------------------------------
19/15    PLS-00103: Encountered the symbol ")" when expecting one of the
     following:
     (

21/18    PLS-00103: Encountered the symbol ")" when expecting one of the
     following:
     (

样本输出:

DEPTNAME  AVGGRADE:  >70, <=80  >80,<=90

【问题讨论】:

问题是max是保留字,不能作为变量使用 除了 Fabien TheSolution 的回答,我建议进行一些修改。循环变量grade_tuple 由oracle 隐式声明,不需要显式声明。此外,FOR grade_tuple IN grades LOOP 将隐式打开(和关闭?)游标。我会说在关闭之前检查grades%ISOPEN 是否为真。 【参考方案1】:

可能是因为maxmin是保留字...所以它寻找max()min()...

但看起来你只是犯了一个错误。我认为您需要尝试一下:

    if (temp>max_avg) then
        max_avg := temp;
    elsif (temp<min_avg) then
        min_avg := temp;
    end if;

【讨论】:

我有一些错误,但将名称从 min/max 更改为其他名称有效!再次感谢。【参考方案2】:

if 块中不需要括号。像这样写:

    if temp>max then
        max_avg := temp;
    elsif temp<min then
        min_avg := temp;
    end if;

【讨论】:

括号是可选的。因此,它不会给出错误。我认为 Fabien TheSolution 的答案是正确的。

以上是关于令人沮丧的 PL/SQL 错误...PLS-00103的主要内容,如果未能解决你的问题,请参考以下文章

发现令人沮丧的 NoReverseMatch

NSTask 和 NSTaskDidTerminateNotification 令人沮丧的问题

复制资产/资源使 iOS 测试令人沮丧

在 MacOS 上安装 Spyder/Python - 非常令人沮丧

Imagemagick的导入速度令人沮丧

PL\SQL 语句忽略错误