Skip to content

December 9, 2008

25

Patch CodeIgniter untuk Koneksi ke Oracle

Nah dibagian ini aku akan nyoba jelasin, gimana supaya driver oci8 di CI bisa lebih kompatibel dengan oracle. Apabila kamu tidak melakukan patch ini bisa dipastikan kamu akan mengalami kesusahan waktu query2 di oracle. Salah satunya, bila kamu dalam satu page (satu function class CI) melakukan 2 atau lebih query Oracle, maka yang dihasilkan adalah result query yang pertama kali dilakukan. Sungguh mengganggu kan?…

Perlu diketahui cara ini dipakai apabila kamu terlanjur  menggunakan CI 1.6.3 kebawah. Karena patch ini sudah di masukan ke dalam CI 1.7.0. Tapi ndak ada salahnya kan kalo kita tahu apa yang menyebabkan itu terjadi.?

Berikut langkah yang harus dijalankan. :

  1. Buka file ../system/database/DB_driver.php.  Cari bagian seperti ini :
    
    $driver 		= $this->load_rdriver();
    $RES 			= new $driver();
    $RES->conn_id	= $this->conn_id;
    $RES->result_id	= $this->result_id;
    $RES->num_rows	= $RES->num_rows();
    if ($this->dbdriver == 'oci8')
    {
    	$RES->stmt_id		= $this->stmt_id;
    	$RES->curs_id		= NULL;
    	$RES->limit_used	= $this->limit_used;
    }

    trus ubah lah menjadi seperti ini.

    $driver 		= $this->load_rdriver();
    $RES 			= new $driver();
    $RES->conn_id	= $this->conn_id;
    $RES->result_id	= $this->result_id;
    
    if ($this->dbdriver == 'oci8')
    {
    	$RES->stmt_id		= $this->stmt_id;
    	$RES->curs_id		= NULL;
    	$RES->limit_used	= $this->limit_used;
    	$this->stmt_id = NULL;
    }
    $RES->num_rows	= $RES->num_rows();
    

    NULL juga bisa diganti dengan nilai FALSE.

  2. Buka gile ../system/database/driver/oci8/oci8_driver.php. Cari bagian seperti ini :
    $this->_set_stmt_id($sql);
    ocisetprefetch($this->stmt_id, 1000);
    return @ociexecute($this->stmt_id, $this->_commit);
    

    lalu ganti menjadi seperti ini :

    $this->stmt_id = NULL;
    $this->_set_stmt_id($sql);
    ocisetprefetch($this->stmt_id, 1000);
    return @ociexecute($this->stmt_id, $this->_commit);
    

    NULL juga bisa diganti dengan nilai FALSE.

  3. Masih di file yang sama , cari bagian seperti ini :
    function _set_stmt_id($sql)
    {
    	if ( ! is_resource($this->stmt_id))
    	{
    		$this->stmt_id = ociparse($this->conn_id,$this->_prep_query($sql));
    	}
    }
    

    lalu ganti menjadi seperti ini :

    function _set_stmt_id($sql)
    {
            $this->stmt_id = ociparse($this->conn_id,$this->_prep_query($sql));
    }

Nah silakan dicoba, kalo aku sukses dengan perubahan2 diatas. dan sekarang aplikasiku tokcer dengan Oracle.

Sekedar info buat CI dan Oracle, jika kamu mau update atau delete record, gunakan…

$this->db->simple_query($sql)

Metode simple_query itu ada OCI_COMMIT_ON_SUCCESS di tiap selesai query.