Quando selezioni INTO una variabile e non ci sono record restituiti, dovresti ricevere un errore NESSUN DATO TROVATO. Credo che il modo corretto per scrivere il codice sopra sia racchiudere l'istruzione SELECT con il proprio blocco BEGIN/EXCEPTION/END. Esempio:
...
v_final_grade NUMBER;
v_letter_grade CHAR(1);
BEGIN
BEGIN
SELECT final_grade
INTO v_final_grade
FROM enrollment
WHERE student_id = v_student_id
AND section_id = v_section_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_final_grade := NULL;
END;
CASE -- outer CASE
WHEN v_final_grade IS NULL THEN
...