尝试使用 CodeIgniter '调用'存储过程

Posted

技术标签:

【中文标题】尝试使用 CodeIgniter \'调用\'存储过程【英文标题】:Trying to 'call' stored procedures with CodeIgniter尝试使用 CodeIgniter '调用'存储过程 【发布时间】:2012-02-21 04:43:10 【问题描述】:

我有这个带有 CI 的工作代码:

$this->db->query("call nameOfProcedure('param1', @param2)");
$query = $this->db->query('SELECT @param2 as results');
$row = $query->row();

它有效,但如果我尝试使用:

$this->db->call_function('nameOfProcedure', 'param1', '@param2');

我得到了错误:

此功能不适用于您正在使用的数据库。

到底出了什么问题?

谢谢

【问题讨论】:

【参考方案1】:

查看call_function 上的docs。它用于调用非 CI 的 DB 驱动程序原生的函数,而不是用于调用您编写的过程。

您可以检查 CI 2.1.0 上 /system/database/DB_driver.php Ln 998 中的 call_function 代码,以清楚地了解它在做什么。

【讨论】:

不知道为什么你没有选择这个答案是正确的。文档清楚地说明它用于调用 PHP 数据库函数。它没有提到存储过程。【参考方案2】:

以防万一它帮助任何人。我使用这个库来处理 CI 中的存储过程,它也支持多个结果集。

这里是代码

我叫它Mydb.php

<?php #if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Mydb

   private $CI, $Data, $mysqli, $ResultSet;

   /**
   * The constructor
   */

   function __construct()
   
     $this->CI =& get_instance();
     $this->Data = '';
     $this->ResultSet = array();
     $this->mysqli = $this->CI->db->conn_id;
   

    public function GetMultiResults($SqlCommand)
    
    /* execute multi query */
    if (mysqli_multi_query($this->mysqli, $SqlCommand)) 
        $i=0;
        do
        

             if ($result = $this->mysqli->store_result()) 
             
                while ($row = $result->fetch_assoc())
                
                    $this->Data[$i][] = $row;
                
                mysqli_free_result($result);
             
            $i++; 
        
        while ($this->mysqli->next_result());
    
    return $this->Data;

      

?>  

从控制器这样调用它

$this->load->library('mydb');
$arr  = $this->mydb->GetMultiResults("CALL GetReferrals()");

另外,请务必设置mysqli 驱动程序 在application/config/database.php

$db['default']['dbdriver'] = 'mysqli';

【讨论】:

库只支持返回多个结果集,如果一个过程只返回一个结果ret,会抛出错误。要也支持返回一个结果返回,必须更改行“while ($this->mysqli->next_result());”到“while ($this->mysqli->more_results()&&$this->mysqli->next_result());”。 @Stony 它是一个 do-while 循环,你测试它不工作了吗?

以上是关于尝试使用 CodeIgniter '调用'存储过程的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 CodeIgniter 中调用存储过程?

CodeIgniter 活动记录调用多个存储过程的问题

存储过程将codeigniter与mysql数据库断开连接

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

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