2009-03-13 6 views
1

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

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 невозможно.

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

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

ответ

1

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

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

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

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

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

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

+0

Решение OID работает на моей машине. Какую версию Oracle вы использовали? – tuinstoel

+0

Это было довольно много лет назад (вероятно, 8, возможно, 9i). Моя особая проблема заключалась в раздувании CLOBS или VARCHAR2 (4000). Путь java позволяет обойти ограничения DBLinks. –

+0

8 и 9 немного старые. Он работает на моей машине с OID, я сделал ссылку с Oracle 11.1 на Oracle 10.2. – tuinstoel

0

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

+0

нет, его распределенная база данных. ядро в центре и много точек вокруг. dblink - его самый быстрый и превентивный способ – drnk

0

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

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

Смежные вопросы