从CodeIgniter Active Record类调用存储过程

时间:2011-01-28 11:34:59

标签: php sql-server stored-procedures codeigniter activerecord

在我的 CI应用程序设置中查询mssql数据库。我想从stored procedure执行active record。但我无法掌握任何可靠的文件。

有没有人有使用CodeIgniter和/或Active Record调用存储过程并传入参数的经验?

谢谢,

比利

6 个答案:

答案 0 :(得分:14)

是的,请在您的模型中尝试此操作。

$this->db->query("call {storedprocedure function name} ");

如果您在一次调用多个存储过程时遇到问题,则需要添加以下行

/* ADD THIS FUNCTION IN SYSTEM/DATABASE/DB_ACTIVE_REC */
/* USAGE $this->db->freeDBResource($this->db->conn_id); */
function freeDBResource($dbh){
    while(mysqli_next_result($dbh)){
            if($l_result = mysqli_store_result($dbh)){
              mysqli_free_result($l_result);
            }
        }
}

答案 1 :(得分:3)

如果您使用带有mssql的更高版本的codeigniter或带有存储过程的sqlsrv,则使用query('CALL procedureName($param1,$params,....)')中的“CALL”可能无效。

在使用MSSQL的情况下:

$this->db->query('EXEC procedureName')

OR

$this->db->query('EXEC procedureName $param1 $param2 $param3,...')

在某些情况下,您可能需要为驱动程序启用一些常量。在这种情况下运行:

$this->db->query('Set MSSQL constant ON )

在运行常规查询之前。

答案 2 :(得分:1)

我已将以下功能添加到/system/database/drivers/mysqli/mysqli_driver.php中的类CI_DB_mysqli_driver


    function free_db_resource()
    {
        while(mysqli_next_result($this->conn_id))
        {
            if($l_result = mysqli_store_result($this->conn_id))
            {
                mysqli_free_result($l_result);
            }
        }
    }

并在程序调用

后使用它
$this->db->free_db_resource();

感谢wework4web

答案 3 :(得分:1)

调用具有参数的存储过程的简单方法是使用Codeigniter的数据库库提供的query()方法。

在你的模特中: -

function call_procedure(){
    $call_procedure ="CALL TestProcedure('$para1', '$para2', @para3)";
    $this->db->query($call_procedure);
    $call_total = 'SELECT @para3 as Parameter3';
    $query = $this->db->query($call_total);
    return $query->result();
}

答案 4 :(得分:1)

这是对上述答案的一点修改。如果您使用的是codeigniter 3,请将此代码放在/system/database/drivers/mysqli/mysqli_driver.php中:

function free_db_resource()
{
    do
    {
        if($l_result = mysqli_store_result($this->conn_id))
        {
            mysqli_free_result($l_result);
        }
    }
    while(mysqli_more_results($this->conn_id)  && mysqli_next_result($this->conn_id));
}

然后像这里建议的其他人一样调用该函数。

答案 5 :(得分:0)

public function callSp_model{
   $sql = "CALL Materialwise_PURC_report(?,?,?)";
    $query = $this->lite_db->query($sql,array($supplierid,$fromdate,$todate));
    return $query->result_array(); }