如何在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中使用存储过程的结果集的主要内容,如果未能解决你的问题,请参考以下文章
如何在 codeigniter 代码中使用两个或多个存储过程?