使用 BizTalk Server 在 Oracle 数据库中使用 REF CURSORS 调用函数和过程

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 作为输出参数,涉及的任务包括:

  1. 创建 BizTalk 项目并为要在 Oracle 数据库中调用的函数生成架构。

  2. 在 BizTalk 项目中创建消息,以便从 Oracle 数据库发送和接收消息。

  3. 创建一个编排以调用 Oracle 数据库中的函数。

  4. 生成和部署 BizTalk 项目。

  5. 通过创建物理发送和接收端口来配置 BizTalk 应用程序。

  6. 启动 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 数据库发送请求,另一条消息用于接收响应。

执行以下步骤创建消息并将其链接到架构:

  1. 打开 BizTalk 项目的“业务流程视图”窗口(如果尚未打开)。 为此,请单击“视图”,指向 “其他窗口”,然后单击“业务流程视图”。

  2. 在业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。

  3. 右键单击新创建的消息,然后选择“ 属性窗口”。

  4. Message_1的“属性”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 键入 请求
    消息类型 在下拉列表中,展开 “架构”,然后选择 “Func_RefCursor.OracleDBBindingSchema.GET_ACTIVITY”,其中 Func_RefCursor 是 BizTalk 项目的名称。 OracleDBBindingSchema 是为GET_ACTIVITY过程生成的架构。
  5. 重复上一步以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 键入 响应
    消息类型 Func_RefCursor.OracleDBBindingSchema.GET_ACTIVITYResponse

设置业务流程

您必须创建 BizTalk 服务业务流程编排,以便使用 BizTalk Server 调用带有 REF CURSOR 参数的过程。 在此业务流程中,会在定义的接收位置投递请求消息。 Oracle 数据库适配器使用此消息,并通过 ODP 将其传递到 Oracle 数据库。 Oracle 数据库的响应将保存到另一个位置。 使用 REF CURSOR 调用函数和过程的典型业务流程将包含:

  • 发送和接收形状以将消息发送到 Oracle 数据库并接收响应。

  • 用于接收要发送到 Oracle 数据库的请求消息的单向接收端口。

  • 双向发送端口,用于将请求消息发送到 Oracle 数据库并接收响应。

  • 单向发送端口,用于将响应从 Oracle 数据库发送到文件夹。

    示例编排如下所示:

    在 Oracle 中使用 Ref 游标的编排

添加消息形状

请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。

形状 形状类型 性能
接收消息 接收 - 将 名称 设置为 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 数据库适配器绑定

另请参阅

开发 BizTalk 应用程序