2009-01-14 53 views
0

我使用Zend Framework 1.7.2,MySQL和MySQLi PDO適配器。我想在給定的操作中調用多個存儲過程。我發現在Windows上有一個調用多個存儲過程的問題。如果你嘗試,你會收到以下錯誤信息:使用Zend Framework調用多個存儲過程

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.

我發現,要解決這個問題,我可能只是接近一個存儲過程在每次通話後連接到數據庫:

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

這對我來說很好,但是,現在我想調用事務中包裝的多個存儲過程。當然,在這種情況下關閉連接並不是一種選擇,因爲它會導致打開的事務回滾。任何想法,如何解決這個問題和/或解決這個問題。

回答

2

我有同樣的錯誤時,這樣的所謂的查詢(變量在下次查詢使用)

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

爲了解決這個問題我已經改變了我的配置文件到

'database' => array(
     'adapter' => 'mysqli', 
+0

非常感謝,我一直在使用超過6個月的醜陋解決方法。我只是放棄了在沒有存儲過程的情況下進行復雜的刪除操作,然而,現在我又恢復了業務。再次感謝。 – 2009-01-31 21:05:31

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)); 
}