Sumber: Tutorial Komputer IT
Siapa pun yang pernah menggunakan Oracle mengetahui bahwa Oracle memiliki tipe data yang disebut VARCHAR2, yang digunakan untuk merepresentasikan string dengan panjang variabel. VARCHAR2 juga merupakan tipe yang direkomendasikan oleh Oracle. Namun terdapat kendala dalam penggunaan VARCHAR2: hanya dapat mewakili maksimal 4000 karakter, yang setara dengan 2000 karakter Cina. Jika nilai karakter tertentu dalam program Anda lebih besar dari 20.002 karakter Cina, VARCHAR2 tidak dapat memenuhi persyaratan. Saat ini, Anda memiliki dua pilihan, satu adalah menggunakan beberapa VARCHAR2 untuk mewakilinya, dan yang lainnya adalah menggunakan bidang LOB. Di sini kita melihat metode kedua.
Pertama, mari kita lihat secara umum bidang LOB Oracle. Tipe LOB Oracle dibagi menjadi tiga tipe: BLOB, CLOB dan BFILE. CLOB disebut karakter LOB, BLOB dan BFILE digunakan untuk menyimpan data biner. Panjang maksimum CLOB dan BLOB adalah 4GB, dan keduanya menyimpan nilai dalam database Oracle. BFILE mirip dengan BLOB, namun menempatkan data pada file eksternal, sehingga disebut juga BLOB eksternal (External BLOB).
Saya rasa kita semua akrab dengan MYSQL. Ada tipe data serupa di MYSQL, seperti TEXT dan BLOB. Dalam fungsi MYSQL PHP, operasi pada TEXT/BLOB bersifat langsung, sama seperti tipe data lainnya. Namun di Oracle, situasinya berbeda. Oracle memperlakukan LOB sebagai tipe data khusus dan tidak dapat menggunakan metode konvensional dalam pengoperasiannya. Misalnya, Anda tidak bisa langsung memasukkan nilai ke dalam bidang LOB dalam pernyataan INSERT, Anda juga tidak bisa menggunakan LIKE untuk mencari.
Berikut adalah beberapa contoh untuk mengilustrasikan cara menggunakan fungsi OCI PHP untuk menyisipkan, mengambil, dan menanyakan data LOB.
Penyisipan
tidak bisa langsung menggunakan pernyataan INSERT untuk memasukkan nilai ke dalam bidang LOB. Secara umum, ada langkah-langkah berikut:
1. Analisis terlebih dahulu pernyataan INSERT dan kembalikan deskriptor LOB
2. Gunakan fungsi OCI untuk menghasilkan objek LOB lokal
3. Ikat objek LOB ke deskriptor LOB
4. Jalankan pernyataan INSERT
5. Tetapkan nilai ke objek LOB
6. Lepaskan objek LOB dan pegangan pernyataan SQL.
Contoh berikut menyimpan file gambar yang diunggah oleh pengguna ke dalam BLOB (atau BFILE, pengoperasiannya sedikit berbeda). Pertama, buatlah tabel dengan struktur sebagai berikut:
BUAT GAMBAR TABEL (
NOMOR ID,
DESKRIPSI VARCHAR2(100),
MIME VARCHAR2(128),
GAMBAR GAMBAR
);
Jika Anda ingin mewujudkan peningkatan ID secara otomatis, buat SEQUENCE lain:
CREATE SEQUENCE PIC_SEQ;
dan kemudian kode program PHP yang digunakan untuk memproses data.
<?php
//Membangun koneksi database Oracle
$conn = OCILogon($user, $password, $SID)
;
//Dua hal yang perlu diperhatikan di sini: Pertama, gunakan fungsi EMPTY_BLOB(). Ini adalah fungsi internal Oracle yang mengembalikan pencari lokasi LOB. Saat memasukkan LOB, Anda hanya dapat menggunakan metode ini untuk terlebih dahulu membuat pencari LOB kosong, dan kemudian mengoperasikan pencari lokasi ini. Fungsi EMPTY_BLOB() adalah untuk tipe BLOB, dan fungsi yang sesuai untuk CLOB adalah EMPTY_CLOB(). Yang kedua adalah bagian setelah RETURNING, yang mengembalikan gambar sehingga fungsi OCI PHP dapat menanganinya.
$stmt = OCIParse($conn,"MASUKKAN KE GAMBAR (id, deskripsi, gambar)
VALUES (pic_seq.NEXTVAL, '$description', '$lob_upload_type', EMPTY_BLOB()) MENGEMBALIKAN gambar KE :PICTURE");
//Buat deskriptor objek LOB lokal. Catat parameter kedua dari fungsi: OCI_D_LOB, yang berarti Menghasilkan objek LOB. Kemungkinan lainnya adalah OCI_D_FILE dan OCI_D_ROWID, yang masing-masing berhubungan dengan objek BFILE dan ROWID.
$
lob = OCINewDescriptor($conn, OCI_D_LOB);
aktif.OCIBindByName
($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
//Menyimpan data ke objek LOB. Karena sumber data di sini adalah file, gunakan metode savefile() objek LOB secara langsung. Metode lain dari objek LOB termasuk save() dan load(), yang masing-masing digunakan untuk menyimpan dan mengambil data. Namun tipe BFILE hanya memiliki satu metode, yaitu save()
if($lob->savefile($lob_upload)){
OCICommit($sambungan);
echo "Upload berhasil<br>";
}kalau tidak{
echo "Gagal mengunggah<br>";
}
//Lepaskan objek LOB
OCIFreeDesc($lob);
Pernyataan Bebas OCI($stmt);
OCILogoff($sambungan);
?>
Ada hal lain yang perlu diperhatikan: nilai field LOB minimal harus 1 karakter, jadi sebelum save() atau savefile() pastikan nilainya tidak boleh kosong. Jika tidak, Oracle akan membuat kesalahan.
Ada dua cara untukmengambil
data dari LOB. Salah satunya adalah dengan menghasilkan objek LOB, kemudian mengikatnya ke pencari lokasi yang dikembalikan oleh pernyataan SELECT, dan kemudian menggunakan metode load() dari objek LOB untuk mengambil data; yang lainnya adalah dengan langsung menggunakan fungsi OCIFetch*** PHP. Cara pertama jauh lebih merepotkan dibandingkan cara kedua, jadi saya akan langsung membahas cara kedua.
Masih menggunakan tabel di atas.
<?php
$sambungan = OCILogon($pengguna, $kata sandi, $SID);
$stmt = OCIParse($conn,"PILIH * DARI GAMBAR DIMANA ID=$pictureid");
OCIExecute($stmt);
//Rahasianya terletak pada parameter ketiga PCIFetchInfo: OCI_RETURN_LOBS. Parameter ketiga adalah mode FETCH. Jika OCI_RETURN_LOBS, nilai LOB langsung dimasukkan ke dalam array hasil alih-alih pencari LOB, sehingga metode load() dari objek LOB tidak diperlukan.
if (OCIFetchInto($stmt, $hasil, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Jenis konten: " .StripSlash($hasil[MIME]);
echo StripSlash($hasil[GAMBAR]);
}
Pernyataan Bebas OCI($stmt);
OCILogoff($sambungan);
?>
Program ini digunakan untuk menampilkan data (gambar) yang ditempatkan di LOB. Metode pemanggilan (dengan asumsi nama skrip adalah getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="Gambar ditempatkan di Oracle LOB">
Permintaan
telah disebutkan sebelumnya, dan bidang LOB Oracle adalah LIKE tidak dapat digunakan untuk pencocokan. Apa yang harus dilakukan? Sebenarnya, ini tidak rumit. Oracle memiliki paket anonim bernama DBMS_LOB, yang berisi semua proses yang diperlukan untuk mengoperasikan LOB.
Misalkan Anda mempunyai tabel seperti ini:
CREATE TABLE ARTICLES (
NOMOR ID,
JUDUL VARCHAR2(100),
KLUB KONTEN
);
Isi artikel ditempatkan pada kolom KONTEN.
Sekarang kita ingin mencari semua artikel yang mengandung "pengguna PHP Cina" di kontennya. Kita bisa melakukannya seperti ini:
<?php
$conn = OCILogon($user, $password, $SID);
//Prosedur DBMS_LOB.INSTR digunakan dalam klausa WHERE. Ini memiliki empat parameter. Dua parameter pertama mewakili pencari LOB (dapat langsung diwakili oleh bidang) dan string yang akan dicari; dua parameter terakhir mewakili offset awal dan jumlah kemunculan. Perlu diperhatikan bahwa nilai pengembaliannya harus dinilai, yaitu harus lebih besar dari 0.
$stmt = OCIParse($conn,"PILIH * DARI ARTIKEL DI MANA DBMS_LOB.INSTR(KONTEN, 'Pengguna PHP Cina', 1, 1) > 0");
OCIExecute($stmt);
if (OCIFetchInto($stmt, $hasil, OCI_ASSOC+OCI_RETURN_LOBS))
{
...
}
Pernyataan Bebas OCI($stmt);
OCILogoff($sambungan);
?>
Oracle juga menyediakan banyak prosedur untuk mengoperasikan data LOB, seperti LENGTH, SUBSTR, dll. Mengenai penggunaannya secara rinci, Anda dapat mempertimbangkan manual pengembangan Oracle.
Itu saja tentang operasi pada data tipe LOB di database Oracle. Karena saya sudah lama tidak berhubungan dengan Oracle, mungkin ada kesalahan dalam artikel ini. Semua orang boleh mengkritik dan mengoreksi saya.