REF CURSORS 的消息架构

REF CURSOR 是一种 Oracle PL/SQL 数据类型,表示指向 Oracle 数据库中的结果集的指针。 REF CURSOR 类型支持数据的输入和输出流式处理,非常适合用于向/从 PL/SQL 代码块传输大量数据。 Microsoft BizTalk Adapter for Oracle Database 支持将强类型和弱类型的 REF CURSOR 参数作为 IN、OUT 和 IN OUT 参数传递给 PL/SQL 过程和函数。

在 Oracle 数据库中,REF CURSOR 类型可以是强类型或弱类型:

  • 使用 RETURN 子句声明强类型 REF CURSOR,如 中所示 TYPE StrongCurType IS REF CURSOR RETURN emp%ROWTYPE;。 强类型 REF CURSOR 变量只能表示包含与声明 REF CURSOR 类型的类型匹配的数据的结果集。 Oracle 数据库适配器返回强类型 REF CURSOR 的强类型结果集。

  • 声明弱类型 REF CURSOR 时没有 RETURN 子句,如 中所示 TYPE WeakCurType IS REF CURSOR;。 Oracle 还提供名为 SYS_REFCURSOR 的特殊 REF CURSOR 类型,可用于声明弱类型的 REF CURSOR 变量。 弱类型 REF CURSOR 变量可以表示包含任何类型的行数据的结果集。 Oracle 数据库适配器返回弱类型 REF CURSOR 的泛型记录的弱类型结果集。

IN REF CURSOR 参数

没有 ODP.NET API 在 Oracle 服务器上创建 REF CURSOR,因此 Oracle 数据库适配器无法为客户端程序提供创建和维护 REF CURSOR 变量的功能。

但是,Oracle 数据库适配器通过指定返回 REF CURSOR 的 PL/SQL 代码块,使客户端能够将 IN REF CURSOR 参数传递给函数或存储过程。 适配器使用此代码在 Oracle 服务器上创建和打开 REF CURSOR 变量;然后,它使用此变量作为 IN 参数调用函数或存储过程。

Oracle 数据库适配器将 IN REF CURSOR 参数表示为包含 PL/SQL 代码块的字符串。 在此块中,REF CURSOR 的位置使用问号 (?) 指定。 PL/SQL 代码块可以包含包含 SQL 查询的 OPEN-FOR 语句;或者它可以包含函数或过程调用,其中打开的 REF CURSOR 在 OUT 参数中返回。

下面演示如何通过调用存储过程或函数来打开 REF CURSOR 来指定 IN REF CURSOR。

<[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>  

下面演示如何通过使用 SELECT 查询打开 REF CURSOR 来指定 IN REF CURSOR。

<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>  

OUT REF CURSOR 参数

OUT REF CURSOR 参数作为强类型或弱类型结果集返回。 返回的结果集的类型取决于在 Oracle 服务器上的存储过程或函数定义中 REF CURSOR 参数是声明为强类型还是弱类型 REF CURSOR。 强类型 REF CURSOR 参数返回强类型结果集,弱类型 REF CURSOR 参数返回弱类型结果集 (例如,使用SYS_REFCURSOR类型声明的参数) 。

下面显示了强类型 OUT REF CURSOR 参数的 XML。

<[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.  

下面显示了弱类型 OUT REF CURSOR 参数的 XML。

<[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  

IN OUT REF CURSOR 参数

由于 Oracle 数据库适配器将 IN REF CURSOR 参数建模为字符串,将 OUT REF CURSOR 参数建模为复杂类型,因此它不能支持 IN OUT REF CURSOR 参数的单一类型。 因此,它将 IN OUT REF CURSOR 参数视为两个不同的参数:请求消息中的 IN 参数和响应消息中的 OUT 参数。

为了避免在服务模型编程中发生名称冲突,Oracle 数据库适配器将字符串“_IN”追加到请求消息中的 IN 参数,以便为名为 [PARAM_NAME] 的给定参数创建两个参数:

  • [PARAM_NAME]_IN 是存储过程或函数请求消息中的 IN REF CURSOR 参数。 它包含一个 PL/SQL 语句, (返回 REF CURSOR 的 select 查询或存储过程或函数调用) 。

  • [PARAM_NAME] 是存储过程或函数响应消息中的 OUT REF CURSOR 参数。 它包含 OUT REF CURSOR 作为强类型或弱类型结果集。

重要

适配器不能支持包含名为 [PARAM_NAME]_IN 的 IN 参数和名为 [PARAM_NAME] 的 IN OUT REF CURSOR 参数的过程或函数。 这是因为适配器需要名为 [PARAM_NAME]_IN 的参数来表示 REF CURSOR 参数的输入,并且不能在请求消息中同时指定这两个参数。

另请参阅

Oracle 数据库的 BizTalk 适配器的消息和消息架构