PL/SQL 异常和错误处理

Posted

技术标签:

【中文标题】PL/SQL 异常和错误处理【英文标题】:PL/SQL Exceptions and Errors Handling 【发布时间】:2011-01-28 09:56:24 【问题描述】:

我正在用 Asp .Net 和 C# 做一个项目。我还使用 ODP .NET 连接到我的 Oracle DB。

我正在使用存储过程将值插入数据库。一切都很好,它也引发了我所有的例外。

我有 3 个例外:

    当我尝试插入的值已存在于数据库中时 当我尝试插入空值时 默认“其他”

当引发前两个异常时,我将错误插入到错误表中,一切顺利。

我真正想知道的是,发生异常时如何向用户显示消息?

类似于dbms_output.put_line("Error");...但我希望它显示在我的网页中。这可能吗?

欢迎任何提示,在此先感谢。

【问题讨论】:

【参考方案1】:

由于您的 .NET 程序是您的客户端,因此您应该让任何未处理的异常从您的 PL/SQL 程序传播并返回到客户端,您可以像处理任何其他异常一样在客户端处理它。

换句话说,您应该从您的 PL/SQL 代码中删除“当其他人”异常,而是使用 C# 异常块包装您的数据库调用(使用 ODP.NET)。在那里,您可以捕获异常并获取 Oracle 错误编号和文本,并根据需要将其显示给用户。

(使用这种方法,您还可以在 PL/SQL 代码中使用 RAISE_APPLICATION_ERROR 向 C# 客户端发出错误信号。)

【讨论】:

非常感谢。有了你的解决方案,我知道我该怎么做。【参考方案2】:

你可以修复存储过程返回一个整数,0代表ok,1代表1类异常,2类2异常等等......这样UI可以通知用户保存方法没有进展顺利。

通常我不会在存储过程中处理异常,但我知道您想从 SQL 记录错误,因此上述方式应该允许您做您想做的事情。

【讨论】:

你好 Davide,有趣的方法。例如,当发生异常时,它将返回例如 1。如何将此值发送回我的应用程序?通过在存储过程中使用 OUT 变量?谢谢【参考方案3】:

在我们的 sql server 存储过程中,我们有这样的东西:

如果@@ERROR 0

return (1)

否则

return (0)

但这取决于存储的功能以及它返回的其他内容,如果存储返回一个表,则可以使用输出参数发回上面讨论的整数。

【讨论】:

以上是关于PL/SQL 异常和错误处理的主要内容,如果未能解决你的问题,请参考以下文章

使用 pl/sql 过程记录错误和处理异常

PL/SQL数据开发那点事

ORACLE PL/SQL编程总结

PL/SQL 错误处理后继续执行

整理课堂笔记 pl/sql orcale异常

pl/sql 中的错误处理