Лучший способ обработки больших объектов в распределенных базах данных Oracle - PullRequest
13 голосов
/ 01 сентября 2008

Если вы создаете 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

Есть еще идеи?

Ответы [ 6 ]

13 голосов
/ 27 января 2013

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

SELECT (select column_b from sample_table@TEST_LINK) AS column_b FROM DUAL
5 голосов
/ 02 сентября 2008

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

1 голос
/ 06 октября 2016

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

1 голос
/ 19 ноября 2008

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

0 голосов
/ 01 сентября 2008

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

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

0 голосов
/ 01 сентября 2008

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

...