Вопрос

У меня есть две схемы: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 невозможно.

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

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

Это было полезно?

Решение

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

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

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

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

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

    Другие советы

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top