代码之家  ›  专栏  ›  技术社区  ›  Brian Fisher

使用Zend框架调用多个存储过程

  •  0
  • Brian Fisher  · 技术社区  · 17 年前

    我使用的是Zend Framework 1.7.2、MySQL和MySQLi PDO适配器。我想在给定操作期间调用多个存储过程。我发现在Windows上调用多个存储过程时出现问题。如果你尝试它,你会得到以下错误消息:

    SQLSTATE[HY000]:一般错误:2014 无法执行查询,而其他 无缓冲查询处于活动状态。 考虑使用 PDO语句::fetchAll()。 或者,如果您的代码仅 你永远不会和mysql竞争 可以通过设置启用查询缓冲 PDO::MY_RESATTR_USE_BUFFERED_QUERY 属性。

    我发现,为了解决这个问题,我可以在每次调用存储过程后关闭与数据库的连接:

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

    这对我来说很有效,但是,现在我想调用一个事务中包含的多个存储过程。当然,在这种情况下,关闭连接不是一种选择,因为它会导致打开的事务回滚。任何想法,如何解决这个问题和/或解决这个问题。

    3 回复  |  直到 17 年前
        1
  •  2
  •   waney    17 年前

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

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

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

    'database' => array(
            'adapter' => 'mysqli',
    
        2
  •  1
  •   emeraldjava    16 年前

    这种准备、执行然后关闭调用存储过程的每个$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));
    }
    
        3
  •  0
  •   Navin Kumar    7 年前

    你可以使用prepare语句。无需更换司机

    $sql = "CALL procedure()";
    $stmt = $this->db->createStatement();
    $stmt->prepare($sql);
    $result = $stmt->execute();