Лучший способ обработки больших объектов в распределенных базах данных Oracle

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

Вопрос

Если вы создаете dblink Oracle, вы не можете напрямую обращаться к столбцам больших объектов в целевых таблицах.

Например, вы создаете 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

Есть еще идеи?

Это было полезно?

Решение

Да, это грязно, но я не могу придумать, как этого избежать.
Вы можете скрыть некоторые проблемы от клиента, поместив создание временной таблицы в хранимую процедуру (и используя «quot; выполнить немедленное», чтобы создать таблицу)

Одна вещь, которую вам нужно остерегаться, это оставить временные таблицы (если что-то не получится в середине сеанса, прежде чем вы успеете его почистить) - вы можете запланировать периодическое выполнение задания оракула и удалить все оставшиеся таблицы. ,

Другие советы

Лучшее решение - использовать запрос, как показано ниже, где column_b - это BLOB:

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL

Вы можете использовать materalized представления для обработки всего "кеша" управление. Это не идеально, но работает в большинстве случаев:)

Для данных запроса решение user2015502 является самым умным. Если вы хотите вставить или обновить удаленную базу данных AT большого объекта (вставить в xxx @ yyy ...), вы можете легко использовать для этого динамический SQL. См. мое решение здесь:

У вас есть конкретный сценарий? Например, если LOB содержит файлы и вы находитесь в интрасети компании, возможно, вы можете написать хранимую процедуру для извлечения файлов в известный каталог в сети и доступа к ним оттуда.

В этом конкретном случае единственным способом связи двух систем является использование dblink.

Кроме того, решение для таблиц не так уж и страшно, просто грязно иметь необходимость "кэшировать" данные на моей стороне dblink.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top