Ссылка на пользовательские типы Oracle через DBLINK? - PullRequest
3 голосов
/ 18 декабря 2008

Я работаю в двух разных схемах Oracle на двух разных экземплярах Oracle. Я определил несколько типов и наборов типов для передачи данных между этими схемами. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя тип имеет абсолютно одинаковые определения (одни и те же сценарии, используемые для создания обоих наборов в схемах), Oracle видит их как разные объекты, которые не являются взаимозаменяемыми.

Я думал о приведении входящего объекта удаленного типа к тому же локальному типу, но я получаю сообщение об ошибке при ссылке на типы через ссылки dblinks.

По сути, я делаю следующее:

DECLARE
  MyType  LocalType; -- note, same definition as the RemoteType (same script)
BEGIN
  REMOTE_SCHEMA.PACKAGE.PROCEDURE@DBLINK( MyType );  -- MyType is an OUT param
  LOCAL_SCHEMA.PACKAGE.PROCEDURE( MyType ); -- IN param
END;

Сбой, потому что вызов процедуры REMOTE не может понять MyType, поскольку он обрабатывает LocalType и RemoteType как разные типы объектов.

Я также попытался объявить MyType следующим образом:

  MyType REMOTE_SCHEMA.RemoteType@DBLINK;

но я получаю еще одну ошибку при ссылке на типы через ссылки dblinks. CASTing между типами также не работает, потому что для приведения я должен ссылаться на удаленный тип через dblink - та же проблема, та же ошибка. Я также пытался использовать SYS.ANYDATA в качестве объекта, который пересекает два экземпляра, но он получает похожую ошибку.

Есть идеи?

UPDATE: Попытка объявить тип объекта с обеих сторон DBLINK с использованием одного и того же OID (полученного вручную с помощью SYS_OP_GUID()), но Oracle по-прежнему «видит» два объекта как разные и выдает ошибку «неправильное число или типы аргументов».

Ответы [ 2 ]

6 голосов
/ 19 декабря 2008

Я прочитал Документацию Oracle, и это не очень сложно.

Вам необходимо добавить OID к вашим определениям типов в обеих базах данных.

Вы можете использовать GUID в качестве OID.

SELECT SYS_OP_GUID() FROM DUAL; 

SYS_OP_GUID()
--------------------------------
AE34B912631948F0B274D778A29F6C8C

Теперь создайте свой UDT в обеих базах данных с ЖЕ OID.

create type testlinktype oid 'AE34B912631948F0B274D778A29F6C8C' as object
( v1 varchar2(10) , v2 varchar2(20) );
/

Теперь создайте таблицу:

create table testlink 
( name testlinktype);

insert into testlink values (testlinktype ('RC','AB'));

commit;

Теперь вы можете выбрать из таблицы через ссылку db в другой базе данных:

select * from testlink@to_ora10;

NAME(V1, V2)
--------------------------
TESTLINKTYPE('RC', 'AB')

Если вы получаете ошибку ORA-21700 при первой попытке выбора через dblink, просто переподключитесь.

1 голос
/ 18 декабря 2008

Я думаю, что основная проблема заключается в том, что Oracle не знает, как автоматически сериализовать / десериализовать ваш пользовательский тип, так сказать, по проводам.

Лучше всего, вероятно, передать XML (или другое) представление по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...