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

2

调用这样的查询时我有同样的错误(在下一个查询中使用的变量)

$db->query("SET @curr = 0.0;");

为了解决这个问题,我将配置文件更改为

'database' => array(
        'adapter' => 'mysqli',
于 2009-01-23T11:17:12.060 回答
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 回答
0

您可以使用准备语句。无需更换驱动程序

$sql = "CALL procedure()";
$stmt = $this->db->createStatement();
$stmt->prepare($sql);
$result = $stmt->execute();
于 2019-02-14T13:00:18.720 回答