我不推荐这种做法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 server存储过程转换为oracle,并使用我们使用的工具(sql开发人员)制作了goto语句。我们讨厌进入每个SP并开始搞乱逻辑 – Omnipresent 2009-10-13 15:33:57
@Omnipresent:当你说“SQL开发者”时,你是指Oracle SQL Developer还是其他一些同名的工具? – 2009-10-14 10:09:19
Oracle sql Developer – Omnipresent 2009-10-15 18:11:05