不会因触发错误而抛出PDO异常

时间:2012-11-30 15:00:15

标签: php oracle triggers pdo

我正在使用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.但这本身并不是一种独特或可靠的方法来确定是否存在错误发生...

1 个答案:

答案 0 :(得分:2)

这是不可能的。触发器(和事件)基于数据库操作在数据库上运行,并不直接与您的查询绑定 - 至少在PHP端看到。您的PDO查询是成功的,这是您的所有语句都知道的事实,根据您的语句对某些表所做的结果设置触发器的事实是无关紧要的。

您拥有的选项是:

  1. 编写另一个查询以确认触发器应该做什么的成功
  2. 可能将初始查询包装到运行查询的存储过程中,并验证触发器操作是否成功。然后调用该存储过程,而不是直接运行查询。