REF CURSOR 是一种 Oracle PL/SQL 数据类型,表示指向 Oracle 数据库中结果集的指针。 REF CURSOR 类型支持输入和输出数据流式处理,非常适合用于向/从 PL/SQL 代码块传输大量数据。 Microsoft BizTalk 适用于 Oracle 数据库的适配器支持将强类型和弱类型的 REF CURSOR 参数传递至 PL/SQL 函数和过程,作为 IN、OUT 和 IN OUT 参数。
在 Oracle 数据库中,REF CURSOR 类型可以是强类型化或弱类型化:
强类型的 REF CURSOR 是通过 RETURN 子句像在
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 参数
没有用于在 Oracle 服务器上创建 REF CURSOR 的 ODP.NET API,因此 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 参数作为强类型或弱类型结果集返回。 返回的结果集的类型取决于 REF CURSOR 参数是在 Oracle 服务器上的存储过程或函数定义中声明为强类型或弱类型的 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 数据库适配器将 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 参数。 它包含返回 REF CURSOR 的 PL/SQL 语句(选择查询或存储过程或函数调用)。
[PARAM_NAME] 是存储过程或函数响应消息中的 OUT REF CURSOR 参数。 它包含 OUT REF CURSOR 作为强类型或弱类型结果集。
重要
适配器不支持包含名为 [PARAM_NAME]_IN 的 IN 参数和名为 [PARAM_NAME] 的 IN OUT REF CURSOR 参数的过程或函数。 这 是因为适配器期望一个名为 [PARAM_NAME]_IN 的参数来表示 REF CURSOR 参数的输入,并且在请求消息中不能同时指定这两个参数。