2008-09-01 7 views
11

Если вы создаете Oracle dblink, вы не можете напрямую обращаться к столбцам LOB в целевых таблицах.Лучший способ обработки LOB в распределенных базах Oracle

Например, вы создаете 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 

Это a documented restriction.

На той же странице предлагает вам получать значения в локальную таблицу, но это ... вид грязный:

CREATE TABLE tmp_hello 
AS SELECT column_a 
from [email protected]_LINK 

Любые другие идеи?

ответ

4

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

0

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

0

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

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

1

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

8

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

SELECT (select column_b from [email protected]_LINK) AS column_b FROM DUAL 
+3

Это работает как шарм !!! Лучший ответ в интернете! – gabrjan 2014-04-03 11:40:50

0

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