ที่มา: บทช่วยสอนคอมพิวเตอร์ไอที
ใครก็ตามที่เคยใช้ Oracle จะรู้ว่า Oracle มีประเภทข้อมูลชื่อ VARCHAR2 ซึ่งใช้เพื่อแสดงสตริงที่มีความยาวผันแปรได้ VARCHAR2 ยังเป็นประเภทที่แนะนำโดย Oracle แต่มีปัญหาในการใช้ VARCHAR2: สามารถแสดงอักขระได้สูงสุด 4,000 ตัวเท่านั้น ซึ่งเทียบเท่ากับอักขระจีน 2,000 ตัว หากค่าของอักขระบางตัวในโปรแกรมของคุณมากกว่า 20,002 ตัวอักษรจีน แสดงว่า VARCHAR2 ไม่สามารถตอบสนองความต้องการได้ ในเวลานี้ คุณมีสองตัวเลือก หนึ่งคือการใช้ VARCHAR2 หลายตัวเพื่อแสดง และอีกทางหนึ่งคือใช้ฟิลด์ LOB ที่นี่เรามาดูวิธีที่สอง
ก่อนอื่น เรามาดูรายละเอียดทั่วไปของฟิลด์ LOB ของ Oracle กันก่อน ประเภท LOB ของ Oracle แบ่งออกเป็นสามประเภท: BLOB, CLOB และ BFILE CLOB เรียกว่าอักขระ LOB, BLOB และ BFILE ใช้เพื่อจัดเก็บข้อมูลไบนารี ความยาวสูงสุดของ CLOB และ BLOB คือ 4GB และเก็บค่าไว้ในฐานข้อมูล Oracle BFILE คล้ายกับ BLOB แต่จะวางข้อมูลไว้ในไฟล์ภายนอก ดังนั้นจึงเรียกว่า BLOB ภายนอก (BLOB ภายนอก)
ฉันคิดว่าเราทุกคนคุ้นเคยกับ MYSQL มีประเภทข้อมูลที่คล้ายคลึงกันใน MYSQL เช่น TEXT และ BLOB ในฟังก์ชัน MYSQL ของ PHP การดำเนินการกับ TEXT/BLOB จะเป็นไปโดยตรง เช่นเดียวกับข้อมูลประเภทอื่นๆ แต่ใน Oracle สถานการณ์แตกต่างออกไป Oracle ถือว่า LOB เป็นประเภทข้อมูลพิเศษและไม่สามารถใช้วิธีทั่วไปในการดำเนินงานได้ ตัวอย่างเช่น คุณไม่สามารถแทรกค่าลงในฟิลด์ LOB ในคำสั่ง INSERT ได้โดยตรง และไม่สามารถใช้ LIKE เพื่อค้นหาได้
ต่อไปนี้เป็นตัวอย่างบางส่วนที่จะแสดงวิธีใช้ฟังก์ชัน OCI ของ PHP เพื่อแทรก เรียกค้น และสืบค้นข้อมูล LOB
การแทรก
ไม่สามารถใช้คำสั่ง INSERT โดยตรงเพื่อแทรกค่าลงในฟิลด์ LOB โดยทั่วไป มีขั้นตอนต่อไปนี้:
1. ขั้นแรกให้วิเคราะห์คำสั่ง INSERT และส่งคืน LOB descriptor
2. ใช้ฟังก์ชัน OCI เพื่อสร้างอ็อบเจ็กต์ LOB ภายในเครื่อง
3. ผูกอ็อบเจ็กต์ LOB เข้ากับ LOB descriptor
4. ดำเนินการคำสั่ง INSERT
5. กำหนด ค่าให้กับวัตถุ LOB
6 ปล่อยวัตถุ LOB และตัวจัดการคำสั่ง SQL
ตัวอย่างต่อไปนี้จะจัดเก็บไฟล์รูปภาพที่ผู้ใช้อัพโหลดลงใน BLOB (หรือ BFILE การดำเนินการจะแตกต่างออกไปเล็กน้อย) ขั้นแรก สร้างตารางที่มีโครงสร้างดังต่อไปนี้:
CREATE TABLE PICTURES (
หมายเลขประจำตัว
คำอธิบาย VARCHAR2(100)
MIME วาร์ชาร์2(128),
รูปภาพ BLOB
);
หากคุณต้องการเพิ่ม ID โดยอัตโนมัติ ให้สร้างลำดับอื่น:
CREATE
SEQUENCE PIC_SEQ;
<?php
//สร้างการเชื่อมต่อฐานข้อมูล Oracle
$conn = OCILogon($user, $password, $SID);
//ส่งคำสั่ง SQL ไปยัง Oracle
//สองประเด็นที่ควรทราบที่นี่: ขั้นแรก ให้ใช้ฟังก์ชัน EMPTY_BLOB() นี่เป็นฟังก์ชันภายในของ Oracle ที่ส่งคืนตัวระบุตำแหน่ง LOB เมื่อแทรก LOB คุณสามารถใช้วิธีนี้เพื่อสร้างตัวระบุตำแหน่ง LOB ที่ว่างเปล่าก่อน จากนั้นจึงดำเนินการกับตัวระบุตำแหน่งนี้ ฟังก์ชัน EMPTY_BLOB() มีไว้สำหรับประเภท BLOB และฟังก์ชันที่สอดคล้องกันสำหรับ CLOB คือ EMPTY_CLOB() ส่วนที่สองคือส่วนหลังจาก RETURNING ซึ่งจะส่งคืนรูปภาพเพื่อให้ฟังก์ชัน OCI ของ PHP สามารถจัดการได้
$stmt = OCIParse($conn,"ใส่ลงในรูปภาพ (id, คำอธิบาย, รูปภาพ)
ค่า (pic_seq.NEXTVAL, '$description', '$lob_upload_type', EMPTY_BLOB()) การเปลี่ยนรูปภาพเป็น :PICTURE");
//สร้างคำอธิบายของวัตถุ LOB ในเครื่อง หมายเหตุพารามิเตอร์ตัวที่สองของฟังก์ชัน: OCI_D_LOB ซึ่ง หมายถึง สร้างวัตถุ LOB ความเป็นไปได้อื่นๆ คือ OCI_D_FILE และ OCI_D_ROWID ซึ่งสอดคล้องกับวัตถุ BFILE และ ROWID ตามลำดับ
$lob = OCINewDescriptor($conn, OCI_D_LOB);
//ผูกวัตถุ LOB ที่สร้างขึ้นกับตัวระบุตำแหน่งที่ส่งคืนโดยคำสั่ง SQL ก่อนหน้า on.
OCIBindByName($stmt, ':รูปภาพ', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
//บันทึกข้อมูลลงในวัตถุ LOB เนื่องจากข้อมูลต้นฉบับที่นี่คือไฟล์ ให้ใช้เมธอด savefile() ของอ็อบเจ็กต์ LOB โดยตรง วิธีการอื่นของอ็อบเจ็กต์ LOB ได้แก่ save() และ load() ซึ่งใช้ในการบันทึกและดึงข้อมูลตามลำดับ แต่ประเภท BFILE มีเพียงวิธีเดียวเท่านั้น ซึ่งก็คือ save()
if($lob->savefile($lob_upload)){
OCICommit($conn);
echo "อัพโหลดสำเร็จ<br>";
}อื่น{
echo "การอัปโหลดล้มเหลว<br>";
}
//ปล่อยวัตถุ LOB
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
มีอีกสิ่งหนึ่งที่ควรทราบ: ค่าของฟิลด์ LOB ต้องมีอย่างน้อย 1 ตัวอักษร ดังนั้นก่อนที่จะบันทึก() หรือบันทึกไฟล์() ตรวจสอบให้แน่ใจว่าค่าต้องไม่ว่างเปล่า มิฉะนั้น Oracle จะทำข้อผิดพลาด
มีสองวิธีในการดึง
ข้อมูลจาก LOB วิธีหนึ่งคือการสร้างอ็อบเจ็กต์ LOB จากนั้นผูกเข้ากับตัวระบุตำแหน่งที่ส่งคืนโดยคำสั่ง SELECT จากนั้นใช้เมธอด load() ของอ็อบเจ็กต์ LOB เพื่อดึงข้อมูล อีกวิธีคือใช้ฟังก์ชัน OCIFetch*** ของ PHP โดยตรง วิธีแรกยุ่งยากกว่าวิธีที่สองมาก ดังนั้นฉันจะพูดถึงวิธีที่สองโดยตรง
ยังคงใช้ตารางด้านบน
<?php
$conn = OCILogon($ผู้ใช้, $รหัสผ่าน, $SID);
$stmt = OCIParse($conn,"SELECT * จากรูปภาพ โดยที่ ID=$pictureid");
OCIExecute($stmt);
//ความลับอยู่ในพารามิเตอร์ที่สามของ PCIFetchInfo: OCI_RETURN_LOBS พารามิเตอร์ที่สามคือโหมด FETCH หาก OCI_RETURN_LOBS ค่า LOB จะถูกใส่ลงในอาร์เรย์ผลลัพธ์โดยตรงแทนที่จะเป็นตัวระบุตำแหน่ง LOB ดังนั้นจึงไม่จำเป็นต้องใช้เมธอด load() ของอ็อบเจ็กต์ LOB
ถ้า (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
-
echo "ประเภทเนื้อหา: " . StripSlashes($result[MIME]);
echo StripSlashes($ผล[รูปภาพ]);
-
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
โปรแกรมนี้ใช้สำหรับแสดงข้อมูล (รูปภาพ) ที่อยู่ใน LOB วิธีการเรียก (สมมติว่าชื่อสคริปต์คือ getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="Picture added in Oracle LOB">
มีการกล่าวถึง
แบบสอบถาม
มาก่อน และฟิลด์ LOB ของ Oracle คือLIKE ไม่สามารถใช้ในการจับคู่ได้ จะทำอย่างไร? จริงๆ แล้ว มันไม่ซับซ้อน Oracle มีแพ็คเกจที่ไม่ระบุชื่อที่เรียกว่า DBMS_LOB ซึ่งมีกระบวนการทั้งหมดที่จำเป็นในการใช้งาน LOB
สมมติว่าคุณมีตารางดังนี้:
CREATE TABLE ARTICLES (
หมายเลขประจำตัว
ชื่อ วาร์ชาร์2(100)
เนื้อหากลุ่ม
)
เนื้อหาของบทความอยู่ในช่องเนื้อหา
ตอนนี้เราต้องการค้นหาบทความทั้งหมดที่มี "ผู้ใช้ PHP Chinese" ในเนื้อหา เราสามารถทำได้ดังนี้:
<?php
$conn = OCILogon($user, $password, $SID);
//ขั้นตอน DBMS_LOB.INSTR ถูกใช้ในส่วนคำสั่ง WHERE มีพารามิเตอร์สี่ตัว สองตัวแรกแสดงถึง LOB locator (สามารถแสดงได้โดยตรงด้วยฟิลด์) และสตริงที่จะค้นหา สองอันหลังแสดงถึงออฟเซ็ตเริ่มต้นและจำนวนครั้งที่เกิดขึ้น ควรสังเกตว่าต้องตัดสินค่าที่ส่งคืนนั่นคือต้องมากกว่า 0
$stmt = OCIParse($conn,"SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, 'PHP Chinese User', 1, 1) > 0");
OCIExecute($stmt);
ถ้า (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
-
-
-
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Oracle ยังมีขั้นตอนมากมายสำหรับปฏิบัติการข้อมูล LOB เช่น LENGTH, SUBSTR เป็นต้น สำหรับการใช้งานโดยละเอียด คุณสามารถพิจารณาคู่มือการพัฒนาของ Oracle ได้
นั่นคือทั้งหมดที่เกี่ยวกับการดำเนินการกับข้อมูลประเภท LOB ในฐานข้อมูล Oracle เนื่องจากฉันไม่ได้ติดต่อกับ Oracle มาเป็นเวลานาน บทความนี้อาจมีข้อผิดพลาดเกิดขึ้นได้ ทุกคนสามารถวิจารณ์และแก้ไขฉันได้