我有一种情况,我维护的网站调用plsql包/过程(Oracle 11g)。该过程使用传入的参数构建一串动态sql(调用字符串“v_select”)。构建字符串后,使用v_select动态sql字符串打开引用游标。下面的伪代码。
OPEN ref_cursor FOR v_select
USING variables set to input parameters ;
现在,该过程有一个异常块(WHEN OTHERS)来捕获任何异常。在异常块中,任何错误都将写入DB中的表。当执行动态sql时发生错误,异常块似乎没有捕获错误(错误表中没有插入任何条目),但我可以在.net级别看到错误,所以我知道这是Oracle invalid_number错误。
所以,最后,我的问题是这个....从我在网上看到的(这并不多),如果动态的sql chokes,这应该被异常块捕获。它是否正确?
答案 0 :(得分:4)
在查询实际执行之前通常不会检测到此错误,直到您尝试从游标中获取第一行时才会发生此错误。生成的SQL在逻辑上和语法上都是正确的;它只是对数据库中的某些行执行无效的类型转换。因此错误不会在存储过程中被捕获;当存储过程完成时,它还没有发生。
这与动态查询无关。在您从游标中获取之前,同一查询的非动态版本仍然不会抛出错误。