گیک آزاد

Free/Geek/Life.sh

چطور دیتایی از نوع دیتاتایپ CLOB را از دیتابیس بازخوانی کنیم؟

نویسنده:
۱۷ آذر ۹۶

همیشه یکی از سخت‌ترین قسمت‌های کار کردن با دیتابیس‌های Relational سروکله زدن با دیتا تایپ‌های LOB یا همون Large Objectها است مثل دیتا تایپ CLOB که برای ذخیره کردن بیش از چهارگیگابایت text استفاده میشه. همونطور که از اسمش هم بر میاد این نوع دیتا تایپ، Object هست پس نمیشه مثل یک استرینگ با اون رفتار کرد و مثلا اون رو به راحتی داخل یک آرایه در کنار سایر ستون‌های با دیتا تایپ‌ دیگر ریخت و نمایش داد. بازخوانی اطلاعات از نوع این دیتا تایپ کار زیاد ساده‌ای نیست و به ترفندهایی نیاز دارد. متاسفانه در جستجوهایی که انجام دادم راه حل غیر پیچیده و خوب کمتر دیدم و اکثر روشهای موجود نتونست مشکل من رو حل کنه و تصمیم گرفتم با پستی در همین رابطه این تجربه رو در اینجا به اشتراک بگذارم تا شاید روزی به درد کسی بخوره.

فرض کنید که نیاز داشته باشید مثلا با PHP از روی یک دیتابیس اوراکل ستونی از نوع CLOB یا همون Character Large Object رو در کنار سایر ستونها فراخوانی کرده و در یک صفجه نمایش بدید. چیزی مثل نمونه کد PLSQL زیر که در اون سعی داریم پنچ ستون رو از دیتابیس بازیابی کنیم که ستون آخر اون از نوع CLOB هست:

 

 

clob

 

محتوای ستون آخر که از نوع CLOB هست چیزی شبیه به تصویر زیر هست. یعنی یک Object که کلی دیتا داخل اون insert شده:

 

clob4

حالا اگر قصد داشته باشید از محتوای این ستون CLOB قسمت‌هاییش رو بیرون بکشید و بر اساس اون شرط های مختلفی بنویسید و در نهایت مثلا به کمک OCI در PHP از روی دیتابیس اوراکل اون رو بازیابی کنید و در یک صفحه وب نمایش بدید، با مشکل مواجه میشید و پیام خطای زیر رو دریافت میکنید که بهتون میگه این ستون Object هست.

نمونه ای از کد PHP برای بازیابی اطلاعات از دیتابیس اوراکل با OCI و پیغام خطایی که با اجرا کردنش مواجه میشیم رو در زیر میبینید:

و پیعام خطا پس از اجرای کد:

اگر هم بخواید با print_r() دیتاتایپ CLOB رو بخونید با این پیغام خطا مواجه میشید:

که به این خاطر است که بجای محتوای CLOB یک Object به شما برگردونده میشه.

روش‌هایی وجود داره برای اینکه مثلا با PHP بشه این نوع دیتا تایپ رو هندل کرد. مثلا یکی از راه‌ها استفاده از متد load() or read()  به شکل قطعه کد زیر هست ولی در مواردی مثل null بودن یک row این روشها درست نخواهند کرد.

هندل کردن این نوع دیتا تایپ در این سطح کمی پیچیده‌ست. پس من ترجیح میدم بجای هندل کردنش با زبان برنامه نویسی و سروکله زدن با محدودیت های هر کدومش، اون رو در سطخ PLSQL هندل کنم تا بتونم بعدا از اون در هر زبان دیگری استفاده کنم. پس با کمی صبر و حوصله تغییرات مورد نیاز رو در سطح کد PLSQL پیاده سازی میکنم.

برای این کار میتونیم در کد PLSQL تابعی بنویسیم که بتونه محتوای CLOB رو برای ما تبدیل به نوع VARCHAR کنه. پس به جای اینکه به این صورت ستون CLOB رو فراخوانی کنم:

 

clob2

 

اون رو با استفاده از تابع CAST اوراکل تبدیل به VARCHAR میکنیم. چیزی شبیه به این:

 

clob5

 

حالا همونطور که در تصویر بالا میبینید دیتای CLOB داخل این ستون به نوع VARCHAR تبدیل شده و قابل نمایش میشه. حالا کافیه قسمت دلخواه رو با کمی دستکاری در کد PLSQL بیرون کشیده و بر اساس اون شروط دلخواهمون رو بنویسیم.

تصویر اول رو یادتونه؟ حالا من با کمی دستکاری PLSQL به چیزی شبیه به این رسیدم که در ستون سوم همه ردیفها قابل خوندن هستن:

 

clob6

 

حالا کافیه از این کوئری در لابلای کد PHP خودم استفاده کنیم و مثل یک استرینگ این مقدار رو هم داخل یک آرایه بریزیم و در نهایت به درستی اون رو در یک صفحه نمایش بدیم. به همین راحتی 🙂

راستی شما راه دیگری برای هندل کردن این نوع دیتاتایپ که قبلا امتحانش کردید و درست هم کار میکنه سراغ دارید؟ ممنون میشم اگر در قسمت نظرات تجربیاتتون رو به اشتراک بگذارین 🙂