Sua cláusula final deve usar
ELSE
em vez 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;
ATUALIZAÇÃO
Dar conselhos sobre como solucionar isso não é fácil (já que é uma questão de preferência pessoal); coisas que eu costumo tentar são
- limite o exemplo (no seu caso, livre-se de todas as cláusulas adicionais no
CASE
) - reescreva a parte ofensiva da consulta do zero
- copie uma consulta semelhante que funcione e altere essa consulta gradualmente para se parecer com a consulta incorreta até encontrar o erro