1

OCIドライバーでPDOを使用しています。私の特定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

それは不可能だ。トリガー(およびイベント)は、DBアクションに基づいてDBで実行され、少なくともPHP側で見られるように、クエリに直接関連付けられていません。PDOクエリは成功しており、ステートメントが知ることはこれだけです。ステートメントがテーブルに対して行ったことの結果に基づいてトリガーが設定されたという事実は関係ありません。

あなたが持っているオプションは次のとおりです。

  1. 別のクエリを記述して、トリガーが実行するはずだったものがすべて成功したことを確認します
  2. 場合によっては、最初のクエリを、クエリを実行してトリガーアクションの成功を確認するストアドプロシージャにラップします。次に、クエリを直接実行する代わりに、そのストアドプロシージャを呼び出します。
于 2012-11-30T15:28:48.587 に答える