Ссылка на определенные пользователем типы Oracle через DBLINK?
Я работаю в двух разных схемах 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 в качестве объекта, который пересекает два экземпляра, но он получает похожую ошибку.
Есть идеи?
ОБНОВЛЕНИЕ: Попытка объявления типа объекта с обеих сторон DBLINK с использованием того же OID (извлекается вручную с помощью SYS_OP_GUID()
) но Oracle по-прежнему "видит" два объекта как разные и выдает ошибку "неправильное число или типы аргументов".
2 ответа
Я прочитал документацию 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;
Теперь вы можете выбрать из таблицы через dblink в другой базе данных:
select * from testlink@to_ora10;
NAME(V1, V2)
--------------------------
TESTLINKTYPE('RC', 'AB')
Если вы получаете ошибку ORA-21700, когда вы пытаетесь выбрать через dblink в первый раз, просто переподключитесь.
Я думаю, что основная проблема заключается в том, что Oracle не знает, как автоматически сериализовать / десериализовать ваш пользовательский тип, так сказать, по проводам.
Лучше всего, вероятно, передать XML (или другое) представление по ссылке.