PLS-00103:在期待 + & = 等时遇到符号“END”

Posted

技术标签:

【中文标题】PLS-00103:在期待 + & = 等时遇到符号“END”【英文标题】:PLS-00103: Encountered the symbol "END" when expecting + & = etc 【发布时间】:2016-04-15 13:26:08 【问题描述】:

这是我的代码:

DECLARE 
v_grade CHAR(1) := UPPER('&grade');
appraisal VARCHAR(20);
BEGIN
appraisal := CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
WHEN 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE('Grade: '||v_grade||'Appraisal '||appraisal);
END;
/

这是完整的错误代码:

ERROR at line 10:
ORA-06550: line 10, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
 * & = - + < / > at in is mod remainer not rem then
 <an exponent (**)> <> or != or ~= >= <= <> and or like like2
 like4 between || multiset member submultiset.

我正在学习 PL/SQL,我正在尝试我书中的一个示例,但似乎我做错了什么,请不要只给出答案我想知道你是如何解决这个问题的以及我是如何犯错的.

【问题讨论】:

在 WHEN 'No such Grade' 行中使用 else 代替 【参考方案1】:

您的最后一个子句应该使用ELSE 而不是WHEN

DECLARE 
  v_grade CHAR(1) := 'C';
  appraisal VARCHAR(20);
BEGIN
  appraisal := 
    CASE v_grade
      WHEN 'A' THEN 'Excellent'
      WHEN 'B' THEN 'Very Good'
      WHEN 'C' THEN 'Good'
      ELSE  'No such grade'
    END;
  DBMS_OUTPUT.PUT_LINE('Grade: '||v_grade||', Appraisal '||appraisal);
END;

更新

就如何解决此问题向您提供建议并不容易(因为这在很大程度上取决于个人喜好);我通常尝试的事情是

缩小示例范围(在您的情况下,删除CASE 中的所有附加子句) 从头开始重写查询的违规部分 复制一个有效的相似查询并逐渐更改该查询以类似于有问题的查询,直到我遇到错误

【讨论】:

有趣,I didn't think you could do that,但它也适用于 11g。总是很好学... *8-)【参考方案2】:

像这样重写代码

DECLARE 
v_grade CHAR(30) := UPPER('&grade');
appraisal VARCHAR(20);
BEGIN
appraisal := CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE('Grade: '||v_grade||'Appraisal '||appraisal);
END;

【讨论】:

以上是关于PLS-00103:在期待 + & = 等时遇到符号“END”的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00103:在期待以下之一时遇到符号“IS”::=。 ( @ % ; 非空范围默认字符

PLS-00103:遇到符号“;”当期待以下之一时:

PLS-00103:预期时遇到符号“(”

匿名程序的 PLS-00103 错误

PLS-00103 遇到符号“数字”

oracle函数错误pls-00103