如何在codeigniter中使用存储过程的结果集

Posted

技术标签:

【中文标题】如何在codeigniter中使用存储过程的结果集【英文标题】:how to use result sets from stored procedure in codeigniter 【发布时间】:2018-06-25 04:37:35 【问题描述】:

如何在单个存储过程中执行多个查询,然后使用我们模型中所有查询得到的结果。我得到 查询错误:命令不同步;尝试使用存储过程的结果时,您现在无法运行此命令错误。这是我的代码:

**在模型中:**

    /* convert post array data to string */
    $pr = "'" .implode("', '", $data) . "'";
    $pr2 = "'" .implode("', '", $data2) . "'";
    $pr5 = "'" .implode("', '", $data4) . "'";

    /* call stored procedure */
    $this->db->query('CALL addCustomerSalesData("'.$pr.'", "'.$pr2.'", "'.$pr5.'", @CustSalesID, @CustSalesProID)');

    /* get the stored procedure returned output */
    $query = $this->db->query('SELECT @CustSalesID AS cust_sales_id, @CustSalesProID AS cust_sales_pro_id');
    $row = $query->row_array();

    /* this will release memory which is used by stored procedure and make it free for another process */
    $query->next_result();
    $query->free_result();

    /* return inserted id*/
    return $row;

【问题讨论】:

【参考方案1】:

您正在同时运行两个查询。所以mysql会消耗更多的内存来保存它们

$this->db->query('CALL addCustomerSalesData("'.$pr.'", "'.$pr2.'", "'.$pr5.'", @CustSalesID, @CustSalesProID)');

$query = $this->db->query('SELECT @CustSalesID AS cust_sales_id, @CustSalesProID AS cust_sales_pro_id');

你能做什么

    先存储后执行 或$query->free_result(); 在两个查询之间释放这些查询

【讨论】:

嘿谢谢@DeadManAlive bt 我想同时运行所有查询,你能告诉我如何使用 $query->free_result(); 如你所说我想同时运行所有查询,先保存`$result = $this->db->query('CALL ....`然后运行第二个。阅读Codeigniter Transactions【参考方案2】:

当你想在存储过程中使用多个select时,避免命令不同步;您现在无法运行此命令错误您需要做的是:

找到这个文件: 系统/数据库/驱动程序/mysqli/mysqli_driver.php

在这个文件中找到函数:function _execute($sql)

把它改成:

protected function _execute($sql)

    // Free result from previous query
    @mysqli_free_result($this->result_id);

    $sql = $this->_prep_query($sql);

    // get a result code of query (), can be used for test is the query ok
    $retval = @mysqli_multi_query($this->conn_id, $sql);

    // get a first resultset
    $firstResult = @mysqli_store_result($this->conn_id);

    // free other resultsets
    while (@mysqli_next_result($this->conn_id)) 
        $result = @mysqli_store_result($this->conn_id);
        @mysqli_free_result($result);
    

    // test is the error occur or not
    if (!$firstResult && !@mysqli_errno($this->conn_id)) 
        return true;
    
    return $firstResult;

【讨论】:

以上是关于如何在codeigniter中使用存储过程的结果集的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

MySQL 存储过程,获取使用游标查询的结果集

在 codeigniter 中处理存储过程输出参数

如何在 codeigniter 代码中使用两个或多个存储过程?

如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?