Печать курсора и значений исключений (оба не будут работать) - PullRequest
1 голос
/ 23 апреля 2020

Я написал вопрос дней go, и мне, наконец, удалось найти решение, но теперь у меня есть еще один вопрос. Сообщение DBMS.OUTPUT_PUT.LINE должно отображаться при вводе имени континента, и, если этого имени нет в базе данных, будет отображаться ошибка. Моя проблема здесь в том, что появляется правильное сообщение, но сообщение об ошибке не появляется. Что бы это могло быть? Заранее спасибо! Как я уже говорил в своем последнем вопросе, некоторые имена написаны на испанском sh, так как мой учитель хочет, чтобы они были, но их легко понять.

DECLARE
  no_existe EXCEPTION;
  variable number;
  CURSOR listado_paises is
    SELECT *
      FROM paises
     WHERE paises.cod_continente in
           (select cod_continente
              FROM continentes
             WHERE nombre = '&escribe_nombre_cont');
BEGIN
  FOR i in listado_paises 
  LOOP
    UPDATE paises
       SET visualizado = 'Si'
     WHERE cod_continente = i.cod_continente;

    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;      
    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;

Этот код, если он работает нормально, просто второе сообщение не появится!

1 Ответ

1 голос
/ 23 апреля 2020

Вы не видите сообщение, потому что вы получаете и проверяете 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. Но, по-видимому, этот подход требуется вашим назначением.

...