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.

20 Responses to “Patch CodeIgniter untuk Koneksi ke Oracle”

  1. manton says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    masdeka…
    bisa kasih contoh pake CI 1.7 dengan oracle XE, sampai sekarang ini saya masih susah pake CI dengan oracle Xe, saya ingin sekali itu bisa dijalankan.., tolong mas kirimkan saya satu contoh koneksi, kita pake saja database HR yang ada di oracle XE bagaimana menampilkan table employees. Tolong dikirimkan satu file model, satu file controler dan satu file view. Tolong sekali mas… tolong dikirimkan ke mansose@yahoo.com saya desperate sekali, saya beranggapan CI tidak support oracle XE..

    Sebelumnya saya ucapkan terimakasih banyak…

  2. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @manton..
    sori kalo lama bales,

    net kantor tidak bisa di ajak kompromi.
    ini aku tuliskan contoh kode yang konek ke oracle.
    aku sudah mencoba nya di tempat ku, sukses kok

    http://masdeka.web.id/contoh-simple-bikin-aplikasi-dengan-codeigniter

    semoga membantu

    wassalam
    deka

  3. aftri says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    Thanks tutorialnya, sangat membantu :)
    Tapi link-linknya coba dibenerin, mas..
    nyambungnya ke masdeka.com harusnya masdeka.web.id, bukan? ;)

  4. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    terima kasih mas aftri…
    itu peninggalan dari proses pindah hosting dulu….

  5. papanyaraka says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    Thanks Tutornya… Mantabz… jadi ga sabar pengen nyobain oracle…

  6. zaqi says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    Sipp tutorialnya,

    saya udah coba, mangstab banget. Running well, cman ada sedikit masalah klo saya coba pake $this->db->query($sql) kok muncul error ky gini ya

    A PHP Error was encountered
    Severity: Warning
    Message: ocifetchinto() [function.ocifetchinto]: ORA-24374: define not done before fetch or execute and fetch
    Filename: oci8/oci8_result.php

    Line Number: 159

    Mohon pencerahannya !!!

  7. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @zaqi.. mas.. environmentnya mas seperti apa? windows? oracle versi brapa? php brapa? CI versi brapa?

    kalo bisa complete source nya disertakan juga…(sama sekalian SQL nya juga)..

  8. zaqi says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    OS: windows, Oracle 10g R2, CI Ver 1.7.1

    Source :
    function export_ijin(){
    if($this->conn){
    $sql=”SELECT * FROM IJIN”;
    $result=odbc_exec($this->conn,$sql) or die(“Error”);
    $i=0;
    $sql_merge=array();
    while($data=odbc_fetch_array($result)){
    $sql_merge[]=”MERGE INTO IJIN b USING (
    SELECT ‘”.$data['KODE_IJIN'].”‘ as KODE_IJIN
    FROM DUAL) e
    ON (b.IJIN_ID = e.KODE_IJIN)
    WHEN MATCHED THEN
    UPDATE SET b.IJIN_NAMA = ‘”.$data['KET_IJIN'].”‘,
    b.IJIN_DIBAYAR=’”.$data['DIBAYAR'].”‘
    WHEN NOT MATCHED THEN
    INSERT (IJIN_ID, IJIN_NAMA, IJIN_DIBAYAR)
    VALUES (‘”.$data['KODE_IJIN'].”‘,’”.$data['KET_IJIN'].”‘,
    ‘”.$data['DIBAYAR'].”‘)”;
    //echo $sql_merge;
    $this->db->query($sql_merge,FALSE,TRUE);
    $i++;
    }

    if($i>0)
    return ’1′;
    else
    return ’0′;
    }else
    return “0″;

    }

    catatan :
    - jika opsi : $this->db->query($sql_merge,FALSE,FALSE); ->param terakhir FALSE
    tidak kluar error cuman data yg diexport 1 row aja, klo diganti TRUE, jadi error kyk di atas tp data masuk semua
    - klo pake simple query data yg masuk cuman 1

    Makasih atas info dan sarannya

  9. Bagus ato Jelek: Thumb up 0 Thumb down 0

    [...] Oracle Automatic Storage Management Recent Comments Catatan (PHP) » Pengertian MVC di CodeIgniter on Contoh simple bikin aplikasi dengan CodeIgniter.Catatan (PHP) » Mulai dengan CodeIgniter on Pengertian MVC di CodeIgniterdeka on Bikin Laporan PDF dengan CodeIgniteryoze on Bikin Laporan PDF dengan CodeIgniterzaqi on Patch CodeIgniter untuk Koneksi ke Oracle [...]

  10. deka says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @zaqi.

    mas udah coba pake $this->db->simple_query($sql);

    coz dari CI disarankan untuk make fungsi itu bila query yang dijalankan jenisnya perubahan (insert, update, delete).

    saya juga dulu sering make $this->db->query() tapi sering ada bug waktu query2 seperti itu..
    lali aku coba simple_query, ndak ada masalah.

    gudlak.

  11. anata says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    Mas pernah nyoba manggil function di oracle pake PHP. Aku nyoba beberapa fungsi jalan, dan hasilnya keluar. Saat ini aku nyoba panggil sebuah funsi untuk memanggil perhitungan, anehnya klo aku manggilnya pake TOAD hasilnya keluar tapi klo aku dah manggil pake PHP hasilnya kosong padahal parameter yang aku kirim dah sama persis. (aku pake oci_bind_by_name untuk kirim parameter, dan aku dah nyoba beberapa fungsi berhasil)

    Mohon bantuannya mas…Kira-kira aku salah dimana ya? Aku dah nyoba kirim parameternya pake array juga tidak bisa. Oh ya sebetulnya aku pake CI, tapi aku bingung cara manggil function oracle di CI, jadi aku pake koneksi manual (oci_connect bla..bla..)
    Terima kasih sebelum dan sesudahnya…

  12. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @anata..

    sebenernya manggil fungsi oracle di CI sama dengan manggil dengan database lain.
    FYI, di CI pemanggilan fungsi database secara langsung hampir tidak ada, karena hampir semua fungsi database standard sudah di cover oleh driver database CI,
    jadi tinggal set parameter database di config/database.php,
    trus di controller, tinggal panggil $result = $this->db->query($sql);
    dan ambil hasilnya dengan $hasil_array = $result->result_array().. dah jadi deh hasilnya.

    soal di toad bisa , trus di CI gak bisa..
    bisa gak di kasih contoh sql nya dan contoh skrip php CI nya..
    mungkin bisa kelihatan trouble nya dimana…

    regards..

  13. contek_coding says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    ada yang tau, konek ke firebird via CI

  14. codeiginter-noob says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    cara mengeksekusi store procedure / function yang ada di oracle lewat CI
    bagaimana caranya ya ?

    thanks

  15. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @codeiginter-noob .. kalo aku pake method ini
    $this->db->simple_query(“CALL NAMA_JOB(argumen)”);

    mungkin temen2 yang lain punya cara lain…

    @contek_coding.. sebenernya firebird bisa dikonek ama CI, tinggal dibikin driver sendiri aja, karena default dukungan database CI dari situsnya cuma mysql, oracle, sqllite, postgre, mssql, odbc.

    bikin driver sendiri teorinya sih mudah, tinggal ambil contoh driver db lain, trus perintah2 koneksi dbnya di ganti dengan perintah koneksi ke firebird / interbase.. secara praktek sih aku blum pernah coba :)

  16. cuplis says:

    Bagus ato Jelek: Thumb up 1 Thumb down 0

    jika muncul seperti gimana mas?

    A PHP Error was encountered
    Severity: Notice

    Message: Undefined property: stdClass::$numrows

    Filename: oci8/oci8_driver.php

    Line Number: 476

    terim kasih y mas
    saya pake oracle XE,CI 1.7.2

  17. cuplis says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    @anata
    itu sepertinya indeksinya
    kalo mo aman pake OCI_BOTH za

  18. macie says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    mas sy maw tanya sy skrg pake ci 1.7.2 dengan database oracle 10g..
    dalam eksekusi query insert, update and delete itu sukses 100% nah masalah saya dari sisi session saat login bila sukses berhasil masuk pada halaman utama dan session pun dapat di panggil tp pada saat linking pada halaman atau kontroller lain session tersebut hilang seperti halnya di lakukan session destroy dari permasalahan tersebut apakah ada hal-hal yang harus dilakukan atau ada konfigurasi tertentu agar tidak ada masalah pada session pada saat menggunakan oracle 10g soalnya pada saat saya menggunakan database mysql or mssql permasalah session itu tidak ada alias lancar..

    mohon pencerahannya… :D

  19. zidni says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    membantu banget gan,
    thanks berat.
    nyari jawaban pake english,
    nggak taunya yang kasih solusi rekan sebangsa setanah air :D

  20. qorianku says:

    Bagus ato Jelek: Thumb up 0 Thumb down 0

    terima kasih ….:)

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2010 Catatan (PHP) Suffusion WordPress theme by Sayontan Sinha