Типы Oracle sql через dblink - PullRequest
       34

Типы Oracle sql через dblink

1 голос
/ 13 марта 2009

У меня есть две схемы: A и B (Oracle 9). В A есть dblink для B. В B есть пакет, который я вызываю из A. Процедуры в пакете B могут возвращать результаты с различным количеством, и я думаю, что возврат коллекции - лучший способ по этой причине. *

create type B.tr_rad as object (
  name     varchar2(64)
 ,code     number
 ,vendor   number
 ,val      varchar2(255)
 ,num      number
);

create type B.tt_rad as varray(256) of B.tr_rad;

Но из схемы я не могу использовать тип tt_rad, потому что использование SQL-типов с помощью dblink не поддерживается. DBMS_SQL не поддерживается курсорами. Создать типы с одинаковым OID невозможно.

Я думаю использовать временные таблицы. Но, во-первых, это не так хорошо (после того, как удаленная функция возвращает значение, вызывающая сторона должна выбрать коллекцию из удаленной таблицы). И есть опасения замедления работы с временными таблицами.

Может, кто знает альтернативное взаимодействие?

Ответы [ 4 ]

1 голос
/ 14 марта 2009

У меня были подобные проблемы в прошлом. Затем я пришел к выводу, что по сути ссылки на базы данных Oracle «не работают» для чего угодно, кроме простых типов SQL (особенно UDT, у CLOBS могут быть проблемы, может быть и XMLType). Если вы можете заставить работать решение OID, тогда удачи вам.

Решение, к которому я прибегнул, состояло в том, чтобы использовать хранимую процедуру Java вместо ссылки на БД.

Характеристики хранимой процедуры Java:

  1. Может возвращать «богатый набор типов», почти все сложные типы (UDT, таблицы / массивы / переменные), см. Онлайн-документация Oracle для получения подробной информации. Oracle гораздо лучше справляется со сложными (или расширенными) типами из Java, чем из DBLink.
  2. Хранимая Java может получить «соединение по умолчанию» (выполняется в том же сеансе, что и соединение SQL с БД - без проблем аутентификации).
  3. Сохраненная Java вызывает процедуру PL / SQL на удаленной БД, а уровень java JDBC выполняет маршалинг с удаленной БД.
  4. Хранимая Java упаковывает результат и возвращает результаты на уровень SQL или PL / SQL.

Это немного работы, но если у вас есть немного Java, вы должны быть в состоянии "вырезать и вставить" решение вместе из документации Oracle и образца.

Надеюсь, это поможет.

0 голосов
/ 17 марта 2009

Мое решение. На стороне B я создаю временную таблицу, такую ​​как запись коллекции. На стороне A у меня есть оболочка DBMS_SQL, которая вызывает процедуру через dblink. Эта процедура записывает сбор результатов во временную таблицу. После успешного завершения удаленной процедуры я выбираю результаты из удаленной временной таблицы и преобразую ее в локальный тип коллекции.

Ограничение 1. необходимость постоянной синхронизации объекта. 2. невозможность использовать процедуру A-side (вызывающую удаленную процедуру) в SQL-запросе. 3. сложность использования.

0 голосов
/ 13 марта 2009

Альтернативное взаимодействие - иметь одну базу данных со схемами A и B вместо двух баз данных со ссылкой на базу данных.

0 голосов
/ 13 марта 2009

Посмотреть это существующее обсуждение

ссылка на пользовательские типы oracle через dblink

...