Лучший способ обработки больших объектов в распределенных базах данных Oracle
Если вы создаете Oracle dblink, вы не можете напрямую обращаться к столбцам больших объектов в целевых таблицах.
Например, вы создаете 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
Есть другие идеи?
6 ответов
Да, это грязно, я не могу придумать, как этого избежать.
Вы могли бы скрыть часть беспорядка от клиента, поместив создание временной таблицы в хранимую процедуру (и используя "немедленное выполнение" для создания таблицы)
Одна вещь, которую вам нужно остерегаться, - это временные таблицы (если что-то не получится в середине сеанса, прежде чем вы успеете его почистить) - вы можете запланировать периодическое выполнение задания оракула и удалить все оставшиеся таблицы.,
Лучшее решение - использовать запрос, как показано ниже, где column_b - это BLOB:
SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
Для данных запроса решение user2015502 является самым умным. Если вы хотите вставить или обновить большие объекты в удаленной базе данных (вставить в xxx@yyy ...), вы можете легко использовать для этого динамический SQL. Смотрите мое решение здесь:
Вы могли бы использовать materalized представления для обработки всего управления "кешем". Это не идеально, но работает в большинстве случаев:)
В этом конкретном случае единственный способ, которым две системы могут обмениваться данными, - использовать dblink.
Кроме того, табличное решение не так уж и страшно, просто грязно, когда приходится "кэшировать" данные на моей стороне dblink.
У вас есть конкретный сценарий? Например, если LOB хранит файлы и вы находитесь в интрасети компании, возможно, вы можете написать хранимую процедуру для извлечения файлов в известный каталог в сети и доступа к ним оттуда.