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

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

Например, вы создаете dblink с помощью:

create database link TEST_LINK 
  connect to TARGETUSER IDENTIFIED BY password using 'DATABASESID';

После этого вы можете делать такие вещи, как:

select column_a, column_b 
from [email protected]_LINK

За исключением того, что столбец является LOB, вы получаете сообщение об ошибке:

ORA-22992: cannot use LOB locators selected from remote tables

Это документированное ограничение.

На той же странице предлагается извлечь значения в локальную таблицу, но это... беспорядочно:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK

Любые другие идеи?

Ответ 1

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

Ответ 2

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

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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