Вызов хранимой процедуры из класса Active Record CodeIgniter

В моей настройке приложения CI запросить mssql база данных. Я хочу выполнить stored procedure от active record, Но я не могу получить какую-либо основательную документацию.

Кто-нибудь имеет опыт вызова хранимых процедур с CodeIgniter и / или Active Record а передача параметров?

Спасибо,

Билли

6 ответов

Решение

Да, попробуйте это в вашей модели.

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

если у вас возникают проблемы с вызовом более 1 хранимой процедуры за раз, вам нужно добавить следующую строку

/* 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);
            }
        }
}

Если вы используете более поздние версии codeigniter с mssql или sqlsrv с хранимыми процедурами, используйте 'CALL', как в query('CALL procedureName($param1,$params,....)') может не работать

В случае MSSQL используйте:

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

ИЛИ ЖЕ

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

В некоторых случаях вам может потребоваться включить некоторые константы для драйвера. В этом случае запустите:

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

перед запуском вашего обычного запроса.

Я добавил следующую функцию в класс CI_DB_mysqli_driver в /system/database/drivers/mysqli/mysqli_driver.php

    функция free_db_resource()
    {
        в то время как (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

Это небольшая модификация сверху ответа. Если вы используете 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));
}

Затем просто вызовите функцию, как предложили другие.

Простой способ вызвать вашу хранимую процедуру с параметрами - использовать метод query(), предоставляемый библиотекой базы данных Codeigniter.

В вашей модели:-

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();
}
public function callSp_model{
   $sql = "CALL Materialwise_PURC_report(?,?,?)";
    $query = $this->lite_db->query($sql,array($supplierid,$fromdate,$todate));
    return $query->result_array(); }
Другие вопросы по тегам