1

我将 PDO 与 OCI 驱动程序一起使用。我的一个特定INSERT查询导致触发错误:

ERROR at line 1:
ORA-01403: no data found
ORA-06512: at "FOO.BAR", line 5
ORA-04088: error during execution of trigger 'FOO.BAR'

但是,发生这种情况时不会引发异常。我正在使用ERRMODE_EXCEPTION,并且对于标准查询语法错误等会引发异常,但对于源自触发器的任何错误则不会。

在这种情况下,调用$st->execute()也不返回FALSE。此外,$st->errorInfo()并且$st->errorCode()两者都无济于事:

array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}
string(5) "00000"

发生触发错误时,如何让 PDO 引发异常?或者,如果这是不可能的,我如何以编程方式检测何时通过其他方式发生这种情况?我什至知道首先发生错误(除了数据库未更新)$st->rowCount()的唯一方法是报告 0。但这本身并不是确定是否发生错误的唯一或可靠方法......

4

1 回答 1

2

不可能。触发器(和事件)基于数据库操作在数据库上运行,并且不直接绑定您的查询——至少在 PHP 方面是这样。您的 PDO 查询是成功的,这就是您的语句所知道的全部内容,触发器被设置为根据您的语句对某个表所做的任何结果的结果来做某事这一事实是无关紧要的。

您拥有的选项是:

  1. 编写另一个查询以确认触发器应该执行的任何操作是否成功
  2. 可能将初始查询包装到运行查询并验证触发器操作是否成功的存储过程中。然后调用该存储过程而不是直接运行查询。
于 2012-11-30T15:28:48.587 回答