SQL Developer DBMS_OUTPUT без «Процедура PL / SQL успешно завершена».

В SQL Developer при запуске некоторого PL / SQL, когда процедура завершена, появляется сообщение «Процедура PL / SQL успешно завершена». возвращается.

Запущенный PL / SQL может возвращать пользователю сообщения об ошибках, если операция не может быть завершена по какой-либо причине через DBMS_OUTPUT.PUT_LINE, однако пользователь также увидит сообщение «Процедура PL / SQL успешно завершена», что может вводить в заблуждение. (особенно, если окно вывода сценария достаточно мало, чтобы не было видно DBMS_OUTPUT).

Есть ли способ вернуть DBMS_OUTPUT то, что он должен, в то же время, когда сценарий не возвращает «Процедура PL / SQL успешно завершена»?

Если нет, то есть ли в SQL Developer какие-либо альтернативы, о которых я могу не знать, чтобы предоставить пользователю мгновенную персонализированную обратную связь?

declare 

    testex exception;

begin

    if 1=1 then 
        raise testex;
    end if;

exception when testex then

    dbms_output.put_line('Error msg');

end;

person TomB    schedule 29.03.2018    source источник
comment
Вывод в dbms_output не является ошибкой, поэтому обратная связь об успешном выполнении процедуры верна. Если вы хотите сообщить об ошибке, создайте исключение в своем коде PL / SQL.   -  person a_horse_with_no_name    schedule 29.03.2018
comment
Поскольку мне нужно предоставить мгновенную обратную связь с пользователем, я поместил DBMS_OUTPUT, объясняющий ошибку, в исключение; однако, даже если возникнет исключение, появится сообщение «Процедура PL / SQL успешно завершена». все еще отображается   -  person TomB    schedule 29.03.2018
comment
отредактируйте свой вопрос и покажите нам код.   -  person a_horse_with_no_name    schedule 29.03.2018
comment
Код добавлен. Запуск кода показывает «Сообщение об ошибке», а также «Процедура PL / SQL успешно завершена.». Для практичности и во избежание путаницы мне нужно было бы отображать только сообщение об ошибке.   -  person TomB    schedule 29.03.2018
comment
Ваш обработчик исключений проглатывает исключение, и, таким образом, этого никогда не было для вызывающего абонента.   -  person a_horse_with_no_name    schedule 29.03.2018
comment
Разве тогда нельзя показывать только СУБД без сообщения о завершении? Если нет, есть ли какие-нибудь решения, которые могут сработать?   -  person TomB    schedule 29.03.2018


Ответы (3)


Ниже код работает с моей стороны. Вы пытались запустить свой код, как показано ниже?

введите описание изображения здесь

Скопированный текст с веб-сайта, объясняющий команду SET FEEDBACK OFF.

Ссылка на источник: https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm

УСТАНОВИТЬ ПОДАЧУ [НАЗАД] {6 | п | ВКЛ | OFF} - отображает количество записей, возвращаемых сценарием, когда сценарий выбирает не менее n записей.

ON или OFF включает или выключает этот дисплей. При включении обратной связи значение n устанавливается равным 1. Установка обратной связи на ноль эквивалентна ее выключению.

SET FEEDBACK OFF также отключает сообщения подтверждения операторов, такие как «Таблица создана» и «Процедура PL / SQL успешно завершена», которые отображаются после успешных операторов SQL или PL / SQL.

person eifla001    schedule 29.03.2018
comment
Небольшое пояснение о том, что «УСТАНОВКА ОБРАТНОЙ СВЯЗИ ВЫКЛЮЧЕНА» препятствует «успешному завершению процедуры PL / SQL». сообщение от отображения превратит это из вопроса в ответ. - person BriteSponge; 29.03.2018
comment
Смотрите мой обновленный мой ответ. Я считаю, что этот вопрос дублирует эту ссылку stackoverflow.com/questions/250509/ - person eifla001; 29.03.2018
comment
Это вполне может быть дубликат, но это тоже ответ, и это правильный ответ. - person BriteSponge; 29.03.2018

Добавьте оператор RAISE в обработчик ошибок, чтобы повторно вызвать исключение, чтобы любой внешний обработчик мог с ним справиться:

declare 

    testex exception;

begin

    if 1=1 then 
        raise testex;
    end if;

exception when testex then

    dbms_output.put_line('Error msg');

    RAISE;  -- re-raise the exception to an outer handler

end;

Удачи.

person Bob Jarvis - Reinstate Monica    schedule 29.03.2018
comment
Спасибо за ответ, но как это будет работать, если мой код изолирован без внешнего обработчика исключений? Т.е. как бы код, который я предоставил, создавал DBMS_OUTPUT без «успешно завершенной процедуры PL / SQL». - person TomB; 29.03.2018

Вы явно закодировали его для успешного завершения в случае testex исключения. В коде написано: если это произойдет, то распечатайте сообщение и закончите. Если вы хотите, чтобы он действительно потерпел неудачу, он должен вызвать исключение.

Я бы просто использовал что-то вроде этого:

begin
    if 1=1 then 
        raise_application_error(-20000, 'Bananas are not available on a Tuesday');
    end if;
end;
/

begin
*
ERROR at line 1:
ORA-20000: Bananas are not available on a Tuesday
ORA-06512: at line 3

Это вызовет фактическую ошибку, а не просто распечатает сообщение, в котором говорится об ошибке, что позволит вам контролировать развертывание, создавать сценарии и т. Д.

Он также откатит все незафиксированные транзакции в блоке, чего нет в вашем текущем подходе, и покажет фактический номер строки.

person William Robertson    schedule 30.03.2018