REF CURSOR 是 PL/SQL 数据类型,表示通过执行查询生成的服务器端结果集的指针。 REF CURSOR 类型支持输入和输出数据流式传输数据,非常适合用于向/从 PL/SQL 代码传输大量数据。 Oracle 数据库适配器支持强类型和松散类型的 REF CURSOR(SYS_REFCURSOR),这些游标可以作为 IN、OUT 或 IN OUT 参数传递给 PL/SQL 过程和函数。 有关 Oracle 数据库适配器如何支持 REF CURSOR 的详细信息,请参阅 使用 REF CURSOR 参数对函数和过程执行的作。 有关 REF CURSORS 的 XML 结构的信息,请参阅 REF CURSORS 的消息架构。
如何在 Oracle 数据库中调用函数?
使用 Oracle 数据库 适配器与 BizTalk Server 对 Oracle 数据库进行操作时,涉及到在 构建块中所述的开发 BizTalk 应用程序的步骤和过程任务。 若要在 Oracle 数据库中调用一个函数,该函数接收 REF CURSOR 作为输入参数,并返回 REF CURSOR 作为输出参数,涉及的任务包括:
创建 BizTalk 项目并为要在 Oracle 数据库中调用的函数生成架构。
在 BizTalk 项目中创建消息,以便从 Oracle 数据库发送和接收消息。
创建一个编排以调用 Oracle 数据库中的函数。
生成和部署 BizTalk 项目。
通过创建物理发送和接收端口来配置 BizTalk 应用程序。
启动 BizTalk 应用程序。
本主题提供执行这些任务的说明。
基于本主题的示例
基于本主题的示例Func_RefCursor也随 BizTalk 适配器包一起提供。 有关详细信息,请参阅 适配器示例。
生成架构
在本主题中,为了演示 Oracle 数据库适配器如何支持调用采用 REF CURSOR 参数的函数,我们将调用GET_ACTIVITY过程。 此过程采用弱类型 IN REF CURSOR 和强类型 IN OUT REF CURSOR 作为参数。 该函数返回状态、弱类型 OUT REF CURSOR 和强类型 IN OUT REF CURSOR。 GET_ACTIVITY过程作为通过运行示例提供的 SQL 脚本创建的ACCOUNT_PKG的一部分提供。 若要详细了解示例和 SQL 脚本,请参阅 架构示例。
因此,若要调用GET_ACTIVITY过程,我们将在 SCOTT\Package\ACCOUNT_PKG 架构下为同一过程生成架构。 有关如何生成架构的详细信息,请参阅 在 Visual Studio 中获取 Oracle 数据库操作的元数据。
定义消息和消息类型
前面生成的架构描述了业务流程中消息所需的“类型”。 消息通常是变量,类型由相应的架构定义。 必须将在第一步中生成的架构链接到 BizTalk 项目的业务流程视图窗口中的消息。
对于本主题,必须创建两条消息-一个用于向 Oracle 数据库发送请求,另一条消息用于接收响应。
执行以下步骤创建消息并将其链接到架构:
创建消息并链接到架构
打开 BizTalk 项目的“业务流程视图”窗口(如果尚未打开)。 为此,请单击“视图”,指向 “其他窗口”,然后单击“业务流程视图”。
在业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。
右键单击新创建的消息,然后选择“ 属性窗口”。
在Message_1的“属性”窗格中,执行以下作:
用这个 要执行的操作 标识符 键入 请求。 消息类型 在下拉列表中,展开 “架构”,然后选择 “Func_RefCursor.OracleDBBindingSchema.GET_ACTIVITY”,其中 Func_RefCursor 是 BizTalk 项目的名称。 OracleDBBindingSchema 是为GET_ACTIVITY过程生成的架构。 重复上一步以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作:
用这个 要执行的操作 标识符 键入 响应。 消息类型 Func_RefCursor.OracleDBBindingSchema.GET_ACTIVITYResponse
设置业务流程
您必须创建 BizTalk 服务业务流程编排,以便使用 BizTalk Server 调用带有 REF CURSOR 参数的过程。 在此业务流程中,会在定义的接收位置投递请求消息。 Oracle 数据库适配器使用此消息,并通过 ODP 将其传递到 Oracle 数据库。 Oracle 数据库的响应将保存到另一个位置。 使用 REF CURSOR 调用函数和过程的典型业务流程将包含:
发送和接收形状以将消息发送到 Oracle 数据库并接收响应。
用于接收要发送到 Oracle 数据库的请求消息的单向接收端口。
双向发送端口,用于将请求消息发送到 Oracle 数据库并接收响应。
单向发送端口,用于将响应从 Oracle 数据库发送到文件夹。
示例编排如下所示:
添加消息形状
请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。
形状 | 形状类型 | 性能 |
---|---|---|
接收消息 | 接收 | - 将 名称 设置为 ReceiveMessage - 将 “激活 ”设置为 True |
发送消息 | 发送 | - 将 名称 设置为 SendMessage |
接收响应 | 接收 | - 将 名称 设置为 ReceiveResponse - 将 “激活 ”设置为 False |
SendResponse | 发送 | - 将 名称 设置为 SendResponse |
添加端口
请确保为每个逻辑端口指定以下属性。 端口列中列出的名称是在编排中显示的端口的名称。
港口 | 性能 |
---|---|
FileIn | - 将 标识符 设置为 FileIn - 将 类型 设置为 FileInType - 将 通信模式 设置为 单向 - 将通信方向设置为接收 |
LOBPort | - 将 标识符 设置为 LOBPort - 将 类型 设置为 LOBPortType - 将 通信模式 设置为 请求-响应 - 将 通信方向 设置为 发送接收 |
保存响应 | - 将 标识符 设置为 SaveResponse - 将 类型 设置为 SaveResponseType - 将 通信模式 设置为 单向 - 将通信方向设置为发送 |
指定动作形状的消息,并将其连接到端口
下表列出了您应设置的属性及其值,以指定用于操作形状的消息并将其链接到端口。 Shape 列中列出的名称是前文提到的业务编排中显示的消息形状的名称。
形状 | 性能 |
---|---|
接收消息 | - 将 消息 设置为 请求 - 将 Operation 设置为 FileIn.REFCURSOR.Request |
发送消息 | - 将 消息 设置为 请求 - 将 操作 设置为 LOBPort.REFCURSOR.Request |
接收响应 | - 将 消息 设置为 响应 - 将 操作 设置为 LOBPort.REFCURSOR.Response |
SendResponse | - 将 消息 设置为 响应 - 将 操作 设置为 SaveResponse.REFCURSOR.Request |
指定这些属性后,消息形状符和端口被连接,您的编排已完成。
现在必须生成 BizTalk 解决方案并将其部署到 BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程。
配置 BizTalk 应用程序
部署 BizTalk 项目后,前面创建的业务流程将列在 BizTalk Server 管理控制台中的 “业务流程 ”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关演练,请参阅 演练:部署基本 BizTalk 应用程序。
配置应用程序涉及:
为应用程序选择主机。
将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此编排,必须:
请在硬盘上指定一个位置及其对应的文件端口,以便放置请求消息。 BizTalk 业务流程将使用请求消息并将其发送到 Oracle 数据库。
定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将删除包含来自 Oracle 数据库的响应的响应消息。
定义物理 WCF-Custom 或 WCF-OracleDB 发送端口以将消息发送到 Oracle 数据库。 还必须在发送端口中指定操作。 有关如何创建 WCF-Custom 或 WCF-OracleDB 端口的信息,请参阅 手动配置到 Oracle 数据库适配器的物理端口绑定。
注释
使用适配器服务 BizTalk 项目插件生成架构时,还会创建一个绑定文件,其中包含有关端口和为这些端口设置的操作的信息。 可以从 BizTalk Server 管理控制台导入此绑定文件,以创建发送端口(用于出站呼叫)或接收端口(对于入站呼叫)。 有关详细信息,请参阅使用端口绑定文件将物理端口绑定配置到 Oracle 数据库。
启动应用程序
必须启动 BizTalk 应用程序才能调用 Oracle 数据库表中的过程。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程。
在此阶段,请确保:
用于接收业务流程请求消息的 FILE 接收端口正在运行。
用于从业务流程接收响应消息的 FILE 发送端口正在运行。
WCF-Custom 或 WCF-OracleDB 发送消息到 Oracle 数据库的端口正在运行。
正在运行该操作的 BizTalk 业务流程。
执行操作
运行应用程序后,必须将请求消息投递到 FILE 接收位置。 请求消息的架构必须符合前面生成的过程的架构。 有关使用 Oracle 数据库适配器调用函数的请求消息架构的详细信息,请参阅 函数的消息架构和过程 消息架构。
若要调用GET_ACTIVITY过程,必须指定弱类型 IN REF CURSOR 和强类型 IN OUT REF CURSOR 作为参数。 因此,调用此过程的请求消息为:
<GET_ACTIVITY xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG">
<INRECS>BEGIN OPEN ? FOR SELECT * FROM ACCOUNTACTIVITY WHERE ACCOUNT=100001; END;</INRECS>
<INOUTRECS_IN>BEGIN ACCOUNT_PKG.GET_ALL_ACTIVITY(?); END;</INOUTRECS_IN>
</GET_ACTIVITY>
业务流程使用请求消息并将其发送到 Oracle 数据库。 Oracle 数据库的响应保存在定义为业务流程一部分的其他 FILE 位置。
上述请求消息的响应为:
<?xml version="1.0" encoding="utf-8" ?>
<GET_ACTIVITYResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG">
<STATUS>5</STATUS>
<INOUTRECS>
<INOUTRECSRECORD xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG/GET_ACTIVITY">
<TID>1</TID>
<ACCOUNT>100001</ACCOUNT>
<AMOUNT>500</AMOUNT>
<DESCRIPTION />
<TRANSDATE>2007-10-16T16:58:44</TRANSDATE>
<PROCESSED>n</PROCESSED>
</INOUTRECSRECORD>
<INOUTRECSRECORD xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG/GET_ACTIVITY">
.....
.....
</INOUTRECSRECORD>
....
....
</INOUTRECS>
<OUTRECS>
<GenRecordRow xmlns="http://Microsoft.LobServices.OracleDB/2007/03">
<GenRecordColumn>
<GenRecordColumn>
<ColumnName>TID</ColumnName>
<ColumnValue>1</ColumnValue>
<ColumnType>System.Decimal</ColumnType>
</GenRecordColumn>
<GenRecordColumn>
....
</GenRecordColumn>
.....
.....
</GenRecordColumn>
</GenRecordRow>
<GenRecordRow xmlns="http://Microsoft.LobServices.OracleDB/2007/03">
.....
.....
</GenRecordRow>
.....
.....
</OUTRECS>
</GET_ACTIVITYResponse>
请注意,响应包含状态、弱类型 OUT REF CURSOR 和强类型 IN OUT REF CURSOR。
可能的异常
有关使用 BizTalk Server 调用函数和过程时可能会遇到的异常的信息,请参阅 异常和错误处理。
最佳做法
部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,以便无需为同一业务流程创建发送端口、接收端口等。 有关绑定文件的详细信息,请参阅 重复使用 Oracle 数据库适配器绑定。