Лучший способ обработки 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 для этого. См. мое решение здесь: