أفضل طريقة للتعامل مع LOBs في قواعد بيانات Oracle الموزعة
-
09-06-2019 - |
سؤال
إذا قمت بإنشاء Oracle dblink، فلن تتمكن من الوصول مباشرة إلى أعمدة LOB في الجداول المستهدفة.
على سبيل المثال، يمكنك إنشاء dblink باستخدام:
create database link TEST_LINK
connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';
بعد ذلك يمكنك القيام بأشياء مثل:
select column_a, column_b
from data_user.sample_table@TEST_LINK
إلا إذا كان العمود LOB، فستحصل على الخطأ:
ORA-22992: cannot use LOB locators selected from remote tables
هذا هو تقييد موثق.
تقترح نفس الصفحة عليك جلب القيم إلى جدول محلي، ولكن هذا...نوع من الفوضى:
CREATE TABLE tmp_hello
AS SELECT column_a
from data_user.sample_table@TEST_LINK
هل هناك أي أفكار أخرى؟
المحلول
نعم، الأمر فوضوي، ولا أستطيع التفكير في طريقة لتجنب ذلك بالرغم من ذلك.
يمكنك إخفاء بعض الفوضى عن العميل عن طريق وضع إنشاء الجدول المؤقت في إجراء مخزن (واستخدام "التنفيذ الفوري" لإنشاء الجدول)
شيء واحد ستحتاج إلى الانتباه إليه هو ترك الجداول المؤقتة (في حالة فشل شيء ما في منتصف الجلسة، قبل أن يكون لديك الوقت الكافي لتنظيفه) - يمكنك جدولة مهمة أوراكل للتشغيل بشكل دوري وإزالة أي جداول متبقية .
نصائح أخرى
الحل الأفضل هو استخدام الاستعلام كما هو موضح أدناه، حيث يكون column_b عبارة عن كائن كبير الحجم كبير الحجم (BLOB):
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
يمكنك استخدام طرق العرض المادية للتعامل مع إدارة "ذاكرة التخزين المؤقت" بالكامل.إنها ليست مثالية ولكنها تعمل في معظم الحالات :)
بالنسبة لبيانات الاستعلام، فإن حل user2015502 هو الأذكى.إذا كنت تريد إدراج أو تحديث LOB في قاعدة البيانات البعيدة (أدخلها في xxx@yyy ...) يمكنك بسهولة استخدام SQL الديناميكي لذلك.يرى الحل الخاص بي هنا:
هل لديك سيناريو محدد في الاعتبار؟على سبيل المثال، إذا كان LOB يحتفظ بملفات، وكنت متصلاً بشبكة داخلية للشركة، فربما يمكنك كتابة إجراء مخزن لاستخراج الملفات إلى دليل معروف على الشبكة والوصول إليها من هناك.
في هذه الحالة المحددة، الطريقة الوحيدة التي يمكن للنظامين التواصل بها هي استخدام dblink.
كما أن حل الجدول ليس سيئًا إلى هذا الحد، بل إنه أمر فوضوي فقط أن تضطر إلى "تخزين" البيانات الموجودة على جانبي dblink.