Лучший способ обработки больших объектов в распределенных базах данных 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 хранит файлы и вы находитесь в интрасети компании, возможно, вы можете написать хранимую процедуру для извлечения файлов в известный каталог в сети и доступа к ним оттуда.

Другие вопросы по тегам