0

Zend Framework 1.7.2、MySQL、および MySQLi PDO アダプターを使用しています。特定のアクション中に複数のストアド プロシージャを呼び出したいと考えています。Windows では、複数のストアド プロシージャの呼び出しに問題があることがわかりました。試してみると、次のエラー メッセージが表示されます。

SQLSTATE [HY000]: 一般エラー: 2014 他のバッファーされていないクエリがアクティブな間は、クエリを実行できません。PDOStatement::fetchAll() の使用を検討してください。または、コードが mysql に対してのみ実行される場合は、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性を設定して、クエリのバッファリングを有効にすることができます。

この問題を回避するには、ストアド プロシージャを呼び出すたびにデータベースへの接続を閉じるだけでよいことがわかりました。

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
  //If on windows close the connection
  $db->closeConnection();
}

これは私にとってはうまくいきましたが、今ではトランザクションにラップされた複数のストアド プロシージャを呼び出したいと思っています。もちろん、開いているトランザクションのロールバックが発生するため、この状況では接続を閉じることはできません。この問題を解決する方法、および/または問題を回避する方法についてのアイデア。

4

3 に答える 3

1

ストアド プロシージャを呼び出す各 $sql ステートメントを準備、実行、および閉じるというこのパターンは機能します。

public function processTeams($leagueid,$raceid,$gender)
{
    $db = Zend_Db_Table::getDefaultAdapter();
    $sql = $db->prepare(sprintf("CALL addScoringTeams(%d,%d,'%s')",$leagueid,$raceid,$gender));
    $sql->execute();
    $sql->closeCursor();
    $this->logger->info(sprintf("CALL addScoringTeams(%d,%d,'%s')",$leagueid,$raceid,$gender));

    $sql1 = $db->prepare(sprintf("CALL updateScoringTeamTotals(%d)",$raceid));
    $sql1->execute();
    $sql1->closeCursor();
    $this->logger->info(sprintf("CALL updateScoringTeamTotals(%d)",$raceid));

    $sql2 = $db->prepare(sprintf("CALL updateScoringTeamClasses(%d,'%s')",$raceid,$gender));
    $sql2->execute();
    $sql2->closeCursor();
    $this->logger->info(sprintf("CALL updateScoringTeamClasses(%d,'%s')",$raceid,$gender));
}
于 2010-04-29T22:08:40.397 に答える