Я не рекомендовать этот GOTO подход: как и другие уже говорил, исключения является правильным способом обработки ошибок в PL/SQL. Но для решения вашего конкретного вопроса, то вы можете сделать это:
BEGIN
IF V_SYS_ERROR <> 0 THEN
GOTO SQL_ERROR;
END IF;
GOTO PROC_END;
<<SQL_ERROR>>
V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252);
DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE');
DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' ||
V_SYS_ERROR_MSG);
<<PROC_END>>
NULL;
END;
Конечно, это по-прежнему включает в себя изменение кода, так что если вы делаете, что почему бы не сделать это правильно так или иначе? т.е.
DECLARE
SQL_ERROR EXCEPTION;
BEGIN
IF V_SYS_ERROR <> 0 THEN
RAISE SQL_ERROR;
END IF;
EXCEPTION
WHEN SQL_ERROR THEN
V_SYS_ERROR_MSG := SUBSTR(SQLERRM, 1, 252);
DBMS_OUTPUT.PUT_LINE('ERROR IN EXECUTION IN PROCEDURE');
DBMS_OUTPUT.PUT_LINE('THE ERROR CODE IS ' || V_SYS_ERROR || '- ' ||
V_SYS_ERROR_MSG);
RAISE;
END;
Кстати, DBMS_OUTPUT.PUT_LINE не подходит для вывода сообщений об ошибках в системе производства приложений. Используйте его только для отладки во время разработки.
Как вы упомянули, нам придется обрабатывать исключения, когда они происходят правильно? Однако это не очень хорошо для нас. мы конвертируем множество хранимых процедур сервера sql в oracle, а инструмент, который мы использовали (разработчик sql), сделал инструкции goto. мы не хотели бы входить в каждый SP и начинать возиться с логикой – Omnipresent
@Omnipresent: Когда вы говорите «разработчик SQL», вы имеете в виду Oracle SQL Developer или какой-либо другой инструмент с тем же именем? –
Oracle sql Developer – Omnipresent