【问题标题】:PDO Exception not being thrown for trigger errors未因触发错误引发 PDO 异常
【发布时间】:2012-11-18 19:37:28
【问题描述】:

我将 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。但这本身并不是确定是否发生错误的唯一或可靠方法。 ..

【问题讨论】:

  • 能分享一下触发错误的PHP代码吗?

标签: php oracle triggers pdo


【解决方案1】:

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

您有以下选择:

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

【讨论】:

  • 感谢您证实我的怀疑。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 2019-11-29
  • 2013-10-10
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2017-08-31
  • 2019-02-24
相关资源
最近更新 更多