أفضل طريقة للتعامل مع LOBs في قواعد بيانات Oracle الموزعة

StackOverflow https://stackoverflow.com/questions/38074

سؤال

إذا قمت بإنشاء 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top