Вызов нескольких хранимых процедур с Zend Framework - PullRequest
0 голосов
/ 14 января 2009

Я использую 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();
}

Это хорошо сработало для меня, однако теперь я хочу вызвать несколько хранимых процедур, заключенных в транзакцию. Конечно, закрытие соединения не является вариантом в этой ситуации, так как это вызывает откат открытой транзакции. Любые идеи, как решить эту проблему и / или обойти эту проблему.

Ответы [ 3 ]

2 голосов
/ 23 января 2009

У меня такие же ошибки при вызове таких запросов (переменные для использования в следующем запросе)

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

Чтобы исправить это, я изменил свой конфигурационный файл на

'database' => array(
        'adapter' => 'mysqli',
1 голос
/ 30 апреля 2010

Этот шаблон подготовки, выполнения, а затем закрытия каждого оператора $ 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));
}
0 голосов
/ 14 февраля 2019

Вы можете использовать подготовить заявление. Нет необходимости менять драйвер

$sql = "CALL procedure()";
$stmt = $this->db->createStatement();
$stmt->prepare($sql);
$result = $stmt->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...