oracle - PLS-00103: Encontró el símbolo "END" cuando esperaba+y=etc.
plsql oracle11g (2)
Este es mi código:
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;
/
este es el código de error completo:
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.
Estoy aprendiendo PL / SQL y estaba probando un ejemplo de mi libro, pero parece que hice algo mal, no solo dé la respuesta. Quiero saber cómo solucionó este problema y cómo cometí el error.
Reescribe un código como este
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;
Su cláusula final debe usar ELSE
lugar de 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;
ACTUALIZAR
No es fácil darle consejos sobre cómo solucionar este problema (ya que es principalmente una cuestión de preferencia personal); las cosas que suelo probar son
- reducir el ejemplo (en su caso, deshacerse de todas las cláusulas adicionales en el
CASE
) - reescribir la parte ofensiva de la consulta desde cero
- Copie una consulta similar que funcione y cambie esa consulta gradualmente para parecerse a la consulta ofensiva hasta que encuentre el error