usuario sobre rol privilegios permisos listar grants esquema desventajas dar crear consultar como asignar 11g oracle types collections dblink

rol - ¿Hace referencia a los tipos definidos por el usuario de Oracle sobre DBLINK?



grant oracle (2)

Creo que el problema subyacente es que Oracle no sabe cómo serializar / deserializar automáticamente su tipo personalizado a través del cable, por así decirlo.

Su mejor opción es, probablemente, pasar una representación XML (u otra) a través del enlace.

Estoy trabajando en dos esquemas de Oracle diferentes en dos instancias diferentes de Oracle. Definí varios tipos y colecciones de tipos para transferir datos entre estos esquemas. El problema al que me estoy enfrentando es que, aunque el tipo tiene exactamente las mismas definiciones (los mismos guiones utilizados para crear ambos conjuntos en los esquemas), Oracle los ve como objetos diferentes que no son intercambiables.

Pensé en convertir el objeto de tipo remoto entrante como el mismo tipo local, pero aparece un error al hacer referencia a los tipos en dblinks.

Esencialmente, estoy haciendo lo siguiente:

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;

Eso falla porque la llamada al procedimiento REMOTO no puede entender MyType ya que trata a LocalType y RemoteType como diferentes tipos de objetos.

Intenté DECLARAR MyType de la siguiente manera:

MyType REMOTE_SCHEMA.RemoteType@DBLINK;

pero recibo otro error sobre la referencia de tipos en dblinks. Tampoco funciona el intercambio entre tipos porque, para emitir, necesito hacer referencia al tipo de control remoto a través del dblink, el mismo problema, el mismo error. También intenté usar SYS.ANYDATA como el objeto que cruza entre las dos instancias, pero recibe un error similar.

¿Algunas ideas?

ACTUALIZACIÓN: Intentó declarar el tipo de objeto en ambos lados del DBLINK usando el mismo OID (recuperado manualmente usando SYS_OP_GUID() ) pero Oracle todavía "ve" los dos objetos como diferentes y arroja un error de "número o tipos incorrectos de argumentos".


He leído la documentación de Oracle y no es muy difícil.

Necesita agregar un OID a sus definiciones de tipo en ambas bases de datos.

Puede usar un GUID como OID.

SELECT SYS_OP_GUID() FROM DUAL; SYS_OP_GUID() -------------------------------- AE34B912631948F0B274D778A29F6C8C

Ahora crea tu UDT en ambas bases de datos con SAME OID.

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

Ahora crea una tabla:

create table testlink ( name testlinktype); insert into testlink values (testlinktype (''RC'',''AB'')); commit;

Ahora puede seleccionar de la tabla a través de dblink en la otra base de datos:

select * from testlink@to_ora10; NAME(V1, V2) -------------------------- TESTLINKTYPE(''RC'', ''AB'')

Si obtiene el error ORA-21700 cuando intenta seleccionar a través de dblink la primera vez, simplemente vuelva a conectar.