المصدر: البرنامج التعليمي للكمبيوتر الخاص بتكنولوجيا المعلومات
يعرف أي شخص يستخدم Oracle أن Oracle لديها نوع بيانات يسمى VARCHAR2، والذي يستخدم لتمثيل سلاسل ذات أطوال متغيرة. VARCHAR2 هو أيضًا النوع الموصى به من قبل Oracle. ولكن هناك مشكلة في استخدام VARCHAR2: فهو لا يمكنه تمثيل سوى 4000 حرف كحد أقصى، أي ما يعادل 2000 حرف صيني. إذا كانت قيمة حرف معين في برنامجك أكبر من 20002 حرفًا صينيًا، فلن يتمكن VARCHAR2 من تلبية المتطلبات. في الوقت الحالي، لديك خياران، أحدهما هو استخدام VARCHAR2 المتعددة لتمثيله، والآخر هو استخدام حقول LOB. وهنا نلقي نظرة على الطريقة الثانية.
أولاً، دعونا نلقي نظرة عامة على حقول LOB الخاصة بـ Oracle. تنقسم أنواع LOB الخاصة بـ Oracle إلى ثلاثة أنواع: BLOB وCLOB وBFILE. يسمى CLOB بالحرف LOB، ويتم استخدام BLOB وBFILE لتخزين البيانات الثنائية. الحد الأقصى لطول CLOB وBLOB هو 4 جيجابايت، ويقومان بتخزين القيم في قاعدة بيانات Oracle. BFILE يشبه BLOB، ولكنه يضع البيانات في ملف خارجي، لذلك يطلق عليه أيضًا BLOB خارجي (BLOB خارجي).
أعتقد أننا جميعًا على دراية بـ MYSQL. هناك أنواع بيانات مماثلة في MYSQL، مثل TEXT وBLOB. في وظيفة MYSQL الخاصة بـ PHP، تكون العمليات على TEXT/BLOB مباشرة، تمامًا مثل أنواع البيانات الأخرى. لكن في أوراكل الوضع مختلف. تتعامل Oracle مع LOBs كنوع بيانات خاص ولا يمكنها استخدام الأساليب التقليدية في العمليات. على سبيل المثال، لا يمكنك إدراج القيم مباشرة في حقول LOB في عبارة INSERT، ولا يمكنك استخدام LIKE للبحث.
فيما يلي بعض الأمثلة لتوضيح كيفية استخدام وظيفة OCI الخاصة بـ PHP لإدراج بيانات LOB واستردادها والاستعلام عنها.
لا يمكنللإدراج
استخدام عبارة INSERT مباشرة لإدراج القيم في حقول LOB. بشكل عام، هناك الخطوات التالية:
1. قم أولاً بتحليل عبارة INSERT وإرجاع واصف LOB
2. استخدم وظيفة OCI لإنشاء كائن LOB محلي
3. اربط كائن LOB بموصف LOB
4. نفذ عبارة INSERT
5. قم بتعيين قيمة لكائن LOB
6. قم بتحرير كائن LOB ومقبض عبارة SQL يقوم
المثال التالي بتخزين ملف الصورة الذي تم تحميله بواسطة المستخدم في BLOB (أو BFILE، تختلف العملية قليلاً). أولاً، قم بإنشاء جدول بالبنية التالية:
إنشاء صور الجدول (
رقم الهوية،
الوصف VARCHAR2(100)،
مايم فارتشار2 (128)،
الصورة الكبيرة
);
إذا كنت تريد تحقيق الزيادة التلقائية للمعرف، فقم بإنشاء تسلسل آخر:
CREATE SEQUENCE PIC_SEQ؛
ثم رمز برنامج PHP المستخدم لمعالجة البيانات.
<?php
// إنشاء اتصال بقاعدة بيانات Oracle
$conn = OCILogon($user, $password, $SID);
//إرسال عبارات SQL إلى Oracle
// هناك نقطتان يجب ملاحظتهما هنا: أولاً، استخدم الدالة EMPTY_BLOB(). هذه وظيفة داخلية لـ Oracle تقوم بإرجاع محدد موقع LOB. عند إدراج LOB، يمكنك فقط استخدام هذه الطريقة لإنشاء محدد موقع LOB فارغ أولاً، ثم العمل على محدد الموقع هذا. الدالة EMPTY_BLOB() مخصصة لنوع BLOB، والدالة المقابلة لـ CLOB هي EMPTY_CLOB(). والثاني هو الجزء الذي يلي RETURNING، والذي يقوم بإرجاع الصورة حتى تتمكن وظيفة PHP OCI من التعامل معها.
$stmt = OCIParse($conn،"INSERT INTO PICTURES (المعرف، الوصف، الصورة)
VALUES (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);
on.OCIBindByName
($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
// احفظ البيانات في كائن LOB. نظرًا لأن البيانات المصدر هنا عبارة عن ملف، استخدم طريقة savefile() لكائن LOB مباشرةً. تتضمن الطرق الأخرى لكائنات LOB save() وload()، والتي تستخدم لحفظ البيانات واستردادها على التوالي. لكن نوع BFILE له طريقة واحدة فقط، وهي save()
if($lob->savefile($lob_upload)){
OCICommit($conn);
echo "تم التحميل بنجاح<br>";
}آخر{
صدى "فشل التحميل<br>";
}
// حرر كائن LOB
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
هناك شيء آخر يجب ملاحظته: يجب أن تكون قيمة حقل LOB حرفًا واحدًا على الأقل، لذا قبل save() أو savefile()، تأكد من أن القيمة لا يمكن أن تكون فارغة. وإلا فإن أوراكل سوف ترتكب خطأ.
هناك طريقتانلاسترداد
البيانات من LOB. الأول هو إنشاء كائن LOB، ثم ربطه بمحدد الموقع الذي تم إرجاعه بواسطة عبارة SELECT، ثم استخدام طريقة التحميل () لكائن LOB لاسترداد البيانات، والآخر هو استخدام وظيفة OCIFetch*** الخاصة بـ PHP مباشرةً. الطريقة الأولى مزعجة أكثر بكثير من الطريقة الثانية، لذلك سأتحدث عن الطريقة الثانية مباشرة.
لا تزال تستخدم الجدول أعلاه.
<?php
$conn = OCILogon($user, $password, $SID);
$stmt = OCIParse($conn,"SELECT * FROM PICTURES WHERE ID=$pictureid");
OCIExecute($stmt);
// السر يكمن في المعلمة الثالثة لـ PCIFetchInfo: OCI_RETURN_LOBS. المعلمة الثالثة هي وضع FETCH. إذا كان OCI_RETURN_LOBS، فسيتم وضع قيمة LOB مباشرة في مصفوفة النتائج بدلاً من محدد موقع LOB، لذلك ليست هناك حاجة إلى أسلوب التحميل () لكائن LOB.
إذا (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
صدى "نوع المحتوى: " StripSlashes($result[MIME]);
echo StripSlashes($result[PICTURE]);
}
OCIFreeStatement($stmt);
OCILogoff($conn);
>
يستخدم هذا البرنامج لعرض البيانات (الصور) الموضوعة في LOB. طريقة الاستدعاء (بافتراض أن اسم البرنامج النصي هو getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="الصورة الموضوعة في Oracle LOB">
تم ذكرالاستعلام
من قبل، وحقل LOB الخاص بـ Oracle هو لا يمكن استخدام LIKE للمطابقة. ما يجب القيام به؟ في الواقع، الأمر ليس معقدًا. لدى Oracle حزمة مجهولة تسمى DBMS_LOB، والتي تحتوي على كافة العمليات المطلوبة لتشغيل LOB.
لنفترض أن لديك جدول مثل هذا:
إنشاء مقالات الجدول (
رقم الهوية،
عنوان VARCHAR2 (100)،
نادي المحتوى
);
يتم وضع محتوى المقالة في حقل المحتوى.
نريد الآن العثور على كافة المقالات التي تحتوي على "مستخدمي PHP الصينيين" في المحتوى، ويمكننا القيام بذلك على النحو التالي:
<?php
$conn = OCILogon($user, $password, $SID);
// يتم استخدام إجراء DBMS_LOB.INSTR في جملة WHERE. يحتوي على أربع معلمات تمثل المعلمتان الأوليان محدد موقع LOB (يمكن تمثيله مباشرة بواسطة حقل) وتمثل السلسلة التي سيتم البحث عنها؛ وتمثل المعلمتان الأخيرتان إزاحة البداية وعدد التكرارات. وتجدر الإشارة إلى أنه يجب الحكم على قيمتها المرتجعة، أي أنها يجب أن تكون أكبر من 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 لفترة طويلة، فقد تكون هناك أخطاء في هذه المقالة، ونرحب بانتقادي وتصحيحي.