PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY и несколько операторов удаления в подготовленном операторе - PullRequest
2 голосов
/ 01 февраля 2010

Я пытаюсь использовать подготовленный оператор, который удаляет из двух (временных) таблиц:

public function clearTempTables()  
{  
   static $delStmt = null;  
    if (null == $delStmt)  
    {  
        $delStmt = $this->pdo->prepare("DELETE FROM product_string_ids;   
                                        DELETE FROM product_dimension_value_ids;");  
    }  

    $delStmt->execute();
}

Вызов этой функции завершается успешно, но когда оператор выполняется впоследствии, я получаю следующую ошибку:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.  
Consider using PDOStatement::fetchAll().  
Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Установка PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY при создании моего объекта PDO (как указано в документации и многочисленных веб-примерах), похоже, не имеет никакого эффекта, а вызов $ delStmt-> fetchAll () приводит к «SQLSTATE [HY000]: общая ошибка» , что имеет смысл, поскольку операторы delete не должны возвращать и результаты, которые в любом случае нуждаются в извлечении.

Что я здесь не так делаю? Можно ли даже подготовить несколько операторов SQL в один оператор, как это? С точки зрения производительности это, безусловно, имеет смысл, особенно при большом количестве запросов, которые будут работать с временными таблицами, а затем только возвращать окончательный набор результатов.

1 Ответ

1 голос
/ 01 февраля 2010

Афаик, невозможно подготовить несколько выписок как одно (комбинированное) подготавливаемое утверждение.
Но синтаксис DELETE позволяет указывать несколько таблиц для удаления строк из.

$this->pdo->prepare("
  DELETE
    product_dimension_value_ids,product_string_ids
  FROM
    product_dimension_value_ids,product_string_ids
");

(сейчас тестируется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...