是否可以在Oracle存储过程中定义自己的退出代码?

时间:2016-04-29 21:38:01

标签: oracle plsql

在plsql脚本中,您可以使用绑定变量执行此操作。甚至可以在程序中定义自己的退出代码吗?

例如

WHEN UTL_FILE.INVALID_PATH THEN
   DBMS_OUTPUT.PUT_LINE('UTL_FILE.INVALID_PATH');
   UTL_FILE.FCLOSE(v_file_handle);
   exit_code := 8675309;

我在使用调用此存储过程的工具时遇到问题,即使该过程正在进入上述异常块(我故意给出了一个错误的dir路径),它也会在完成后将存储过程标记为成功。 / p>

1 个答案:

答案 0 :(得分:2)

执行此操作的常用方法是使用raise_application_error

WHEN UTL_FILE.INVALID_PATH THEN
   UTL_FILE.FCLOSE(v_file_handle);
   RAISE_APPLICATION_ERROR(-20001, 'UTL_FILE.INVALID_PATH');

当加注发生时,当前块的执行将停止,并且它会向上传播调用堆栈,首先传递到任何外部块,然后是所谓的那个,所以直到有东西碰到它。调用者接收异常,并可以看到代码和消息。您在可以生成的错误代码范围内受到限制,并且您使用的示例编号无效。

如果您希望这些错误编号具有显着性和一致性,您可以将它们定义为包中的常量,可能还有消息文本,但这有点偏离主题......

在这种特定情况下,由于您正在捕获现有的异常,因此您也可以重新提升它:

WHEN UTL_FILE.INVALID_PATH THEN
   UTL_FILE.FCLOSE(v_file_handle);
   RAISE;

然后调用者将在UTL_FILE包中看到与该异常相关的任何错误代码。

最好不要依赖dbms_output来处理此类事情,因为您的调用者可能无法处理可用或已启用的事件。