Вы не видите сообщение, потому что вы получаете и проверяете variable
в цикле курсора; но если значение не существует, то запрос курсора не находит строк, и вы не go внутри l oop, поэтому вы никогда не достигнете запроса на подсчет.
Переместите чек до того, как l oop:
...
BEGIN
SELECT count (*) into variable
FROM paises
WHERE paises.cod_continente in
(select cod_continente FROM continentes WHERE nombre = '&escribe_nombre_cont');
IF variable = 0 THEN
RAISE no_existe;
END IF;
for i in listado_paises loop
UPDATE paises
SET visualizado ='Si'
WHERE cod_continente = i.cod_continente;
DBMS_OUTPUT.PUT_LINE ('Nombre pais: ' || i.nombre);
--COMMIT;
END LOOP;
EXCEPTION
WHEN no_existe THEN
DBMS_OUTPUT.PUT_LINE ('El continente no existe, por favor, revise el nombre');
END;
Коммит внутри l oop выглядит неправильно; если выдается какая-то другая ошибка, у вас будет смесь обновленных и не обновленных строк. Лучше рассматривать как одну транзакцию и фиксировать / откатывать все это.
Конечно, вам не нужно обновлять каждую строку по одному, вы можете выполнить одно обновление; и на самом деле не нужно PL / SQL. Но, по-видимому, этот подход требуется вашим назначением.