【问题标题】:Will an error generated when dynamic sql is executed be caught in the exception block?执行动态sql时产生的错误会被异常块捕获吗?
【发布时间】: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 阻塞,这应该被异常块捕获。它是否正确?

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

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

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

    【讨论】:

    • 引用光标作为输出参数返回到 .net 层。你是说永远不会发现错误?
    • 它不会被存储过程捕获,除非你在存储过程中从游标中获取。这是在查询运行时产生的错误,而不是在解释查询和生成查询计划时产生的错误。
    • 这是有道理的。非常感谢!
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多