执行动态sql时产生的错误会被异常块捕获吗?

Posted

技术标签:

【中文标题】执行动态sql时产生的错误会被异常块捕获吗?【英文标题】:Will an error generated when dynamic sql is executed be caught in the exception block? 【发布时间】:2011-07-13 13:29:42 【问题描述】:

我有一种情况,我维护的站点调用 plsql 包/过程 (Oracle 11g)。该过程使用传入的参数(称为字符串“v_select”)构建动态sql字符串。构建字符串后,使用 v_select 动态 sql 字符串打开一个引用游标。伪代码如下。

OPEN ref_cursor FOR v_select
USING  variables set to input parameters ;

现在,该过程有一个异常块(WHEN OTHERS)来捕获任何异常。在异常块中,任何错误都将写入 DB 中的表。执行动态sql时发生错误时,异常块似乎没有捕获到错误(错误表中没有插入任何条目),但是我可以在.net级别看到错误,所以我知道这是一个 Oracle invalid_number 错误。

所以,最后,我的问题是......从我在网上看到的(这并不多),如果动态 sql 阻塞,这应该被异常块捕获。它是否正确?

【问题讨论】:

【参考方案1】:

通常在查询实际执行之前不会检测到此错误,在您尝试从游标中获取第一行之前可能不会发生这种情况。生成的 SQL 在逻辑和语法上都是正确的;它只是在进行对数据库中某些行无效的类型转换。所以错误不会在存储过程中被捕获;存储过程完成后还没有发生。

这与动态查询无关。在您从游标中获取之前,同一查询的非动态版本仍然不会引发错误。

【讨论】:

引用光标作为输出参数返回到 .net 层。你是说永远不会发现错误? 它不会被存储过程捕获,除非你在存储过程中从游标中获取。这是在查询运行时产生的错误,而不是在解释查询和生成查询计划时产生的错误。 这是有道理的。非常感谢!

以上是关于执行动态sql时产生的错误会被异常块捕获吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 spark 中捕获已执行 sql 的异常

雪花程序没有被 catch 块捕获

基础C#异常处理的总结

使用Hive SQL插入动态分区的Parquet表OOM异常分析

使用Hive SQL插入动态分区的Parquet表OOM异常分析

捕获异常