Лучший способ обработки больших объектов в распределенных базах данных Oracle
-
09-06-2019 - |
Вопрос
Если вы создаете 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.