Esquemas de mensaje para cursores REF CURSOR
Un CURSOR REF es un tipo de datos PL/SQL de Oracle que representa un puntero a un conjunto de resultados en la base de datos de Oracle. Los tipos REF CURSOR permiten el streaming de entrada y salida de datos y son ideales para transferir grandes cantidades de datos hacia y desde un bloque de código PL/SQL. El adaptador de Microsoft BizTalk para oracle Database proporciona compatibilidad para pasar parámetros REF CURSOR REF fuertemente tipados y con tipos débiles a procedimientos PL/SQL y funciones como parámetros IN, OUT e IN OUT.
En la base de datos de Oracle, un tipo REF CURSOR puede ser fuertemente tipado o débilmente tipado:
Un CURSOR REF fuertemente tipado se declara con una cláusula RETURN como en
TYPE StrongCurType IS REF CURSOR RETURN emp%ROWTYPE;
. Una variable REF CURSOR fuertemente tipada solo puede representar un conjunto de resultados que contenga datos que coincidan con el tipo con el que se declara su tipo REF CURSOR. El adaptador de base de datos de Oracle devuelve un conjunto de resultados fuertemente tipado para un CURSOR REF fuertemente tipado.Un CURSOR REF con tipo débil se declara sin una cláusula RETURN como en
TYPE WeakCurType IS REF CURSOR;
. Oracle también proporciona un tipo ESPECIAL REF CURSOR denominado SYS_REFCURSOR que se puede usar para declarar variables REF CURSOR ref con tipo débil. Las variables REF CURSOR con tipo débil pueden representar un conjunto de resultados que contiene cualquier tipo de datos de fila. El adaptador de base de datos de Oracle devuelve un conjunto de resultados débilmente tipado de registros genéricos para un CURSOR REF con tipo débil.
No hay ninguna API de ODP.NET para crear un CURSOR REF en el servidor Oracle, por lo que el adaptador de Oracle Database no puede proporcionar la capacidad de un programa cliente para crear y mantener variables REF CURSOR.
Sin embargo, el adaptador de base de datos de Oracle permite a un cliente pasar parámetros IN REF CURSOR a funciones o procedimientos almacenados especificando un bloque de código PL/SQL que devuelve un CURSOR REF. El adaptador usa este código para crear y abrir una variable REF CURSOR en el servidor oracle; A continuación, llama a la función o al procedimiento almacenado mediante esta variable como parámetro IN.
El adaptador de base de datos de Oracle representa parámetros IN REF CURSOR como cadenas que contienen el bloque de código PL/SQL. Dentro de este bloque, la ubicación del CURSOR REF se especifica con un signo de interrogación (?). El bloque de código PL/SQL puede contener una instrucción OPEN-FOR que contiene una consulta SQL; o puede contener una llamada a una función o procedimiento en la que se devuelve un CURSOR REF abierto en un parámetro OUT.
A continuación se muestra cómo especificar un CURSOR IN REF llamando a un procedimiento almacenado o función para abrir el CURSOR REF.
<[IN_REF_CURSOR_PARAM_NAME]>begin [SP_NAME]([SP_PARAMS...], ?, [SP_PARAMS...]); end;</[IN_REF_CURSOR_PARAM_NAME]>
Example:
<EMP_RC>begin GETEMP(1, ?); end; </EMP_RC>
A continuación se muestra cómo especificar un CURSOR IN REF mediante una consulta SELECT para abrir el CURSOR REF.
<IN_REF_CURSOR_PARAM_NAME>begin open ? for select [FIELD_NAMES] from [TABLE_NAME]; end;</IN_REF_CURSOR_PARAM_NAME>
Example:
<EMP_RC>begin open ? for select * from EMP; end;</EMP_RC>
Los parámetros OUT REF CURSOR se devuelven como conjuntos de resultados fuertemente tipados o con tipo débil. El tipo del conjunto de resultados devuelto depende de si el parámetro REF CURSOR se declara como un CURSOR REF fuertemente tipado o poco tipado en el procedimiento almacenado o la definición de función en el servidor Oracle. Se devuelve un conjunto de resultados fuertemente tipado para parámetros REF CURSOR fuertemente tipados y se devuelve un conjunto de resultados con tipo débil para parámetros REF CURSOR con tipo débil (por ejemplo, parámetros declarados con un tipo SYS_REFCURSOR).
A continuación se muestra el XML para un parámetro OUT REF CURSOR fuertemente tipado.
<[PARAM_NAME]>
<[PARAM_NAME]RECORD>
<[COL1_NAME]>value1</[COL1_NAME]>
<[COL2_NAME]>value2</[COL2_NAME]>
...
</[PARAM_NAME]RECORD>
</[PARAM_NAME]>
[PARAM_NAME] = OUT REF CURSOR parameter name; for example, EMP_REFCURSOR
[COL_NAME] = Name of a column in the REF CURSOR type; for example, Name.
A continuación se muestra el XML para un parámetro OUT REF CURSOR de tipo débil.
<[PARAM_NAME]>
<GenRecordRow xmlns="oracledb">
<GenRecordColumn>
<ColumnName>COL_NAME</ColumnName>
<ColumnValue>COL_VALUE</ColumnValue>
<ColumnType>COL_TYPE</ColumnType>
</GenRecordColumn>
…
</GenRecordRow>
…
</[PARAM_NAME]>
[COL_NAME] = Name of column; for example, Name
[COL_VALUE] = Column value; for example, Scott
[COL_TYPE] = Column data type; for example, System.String
Dado que el adaptador de base de datos de Oracle modela parámetros IN REF CURSOR como cadenas y parámetros OUT REF CURSOR como tipos complejos, no puede admitir un único tipo para un parámetro IN OUT REF CURSOR. Por este motivo, trata los parámetros IN OUT REF CURSOR como dos parámetros diferentes: un parámetro IN en el mensaje de solicitud y un parámetro OUT en el mensaje de respuesta.
Para evitar un conflicto de nombres en la programación del modelo de servicio, el adaptador de base de datos de Oracle anexa la cadena "_IN" al parámetro IN en el mensaje de solicitud para que se cree un parámetro determinado denominado [PARAM_NAME], se crean dos parámetros:
[PARAM_NAME]_IN es un parámetro IN REF CURSOR en el mensaje de solicitud de función o procedimiento almacenado. Contiene una instrucción PL/SQL (una consulta select o un procedimiento almacenado o una llamada de función) que devuelve un CURSOR REF.
[PARAM_NAME] es un parámetro OUT REF CURSOR en el procedimiento almacenado o mensaje de respuesta de función. Contiene out REF CURSOR como un conjunto de resultados fuertemente tipado o débilmente tipado.
Importante
El adaptador no puede admitir un procedimiento o función que contenga un parámetro IN denominado [PARAM_NAME]_IN y un parámetro IN OUT REF CURSOR denominado [PARAM_NAME]. Esto se debe a que el adaptador espera que un parámetro denominado [PARAM_NAME]_IN represente la entrada al parámetro REF CURSOR y no puede especificar ambos parámetros en el mensaje de solicitud.
Mensajes y esquemas de mensaje para el adaptador de BizTalk para la base de datos de Oracle