2010-02-01 152 views
2

我试图使用从两个(临时)表中删除一个准备好的声明:PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY和多个DELETE语句在准备好的声明

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对象(如文档和无数的网络例子所示),似乎没有任何效果,并要求设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY $ delStmt->使用fetchall()结果在“SQLSTATE [ HY000]:一般错误“,这是有道理的,因为删除语句不应该返回,并且结果也需要取回。

我在这里做错了什么?甚至可以将多个SQL语句准备到一个像这样的单个语句中?从性能角度来看,它肯定是有意义的,尤其是对于大量的查询,它们可以在临时表上工作,然后只返回最终结果集。

回答

1

Afaik无法准备多个语句作为一个(组合)准备语句。
DELETE syntax允许您指定多个表来删除行。

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

(现在它的测试)

+0

感谢。很遗憾,我不能将SQL语句捆绑在一起,因为它会限制我使用其他的东西,但是DELETE语法提示有帮助。 任何想法PDO如何处理存储过程呢?他们不是基本上只是收集的声明? – FlintZA 2010-02-01 11:14:26

+0

不,看起来像从多表中删除语法毕竟是无效的。 – FlintZA 2010-02-01 11:20:33

+0

urgs,下次尝试。似乎工作,在MySQL 5.1.37 – VolkerK 2010-02-01 13:59:00