使用 BizTalk Server 在 Oracle 数据库上运行复合操作

Oracle 数据库适配器使适配器客户端能够对 Oracle 数据库执行复合操作。 复合操作可以包括:

  • 对表和视图执行插入、更新、删除和选择操作。

  • 存储过程和函数,在包内部或外部。

    单个复合操作可以按任意顺序包含任意数量的这些操作。 例如,可以有两个插入,后跟一个删除,最后是一个存储过程执行。 此外,还可以针对不同的数据库表或视图执行不同的操作。 有关适配器如何支持复合操作的详细信息,请参阅 在 Oracle 数据库中执行复合操作。 有关复合操作的 SOAP 消息的结构的信息,请参阅 复合操作的消息架构

如何在 Oracle 数据库上执行复合操作?

使用具有 BizTalk Server 的 Oracle 数据库适配器对 Oracle 数据库执行操作涉及构建基块以使用 Oracle 数据库开发 BizTalk 应用程序中所述的过程性任务。 若要对 Oracle 数据库执行复合操作,这些任务包括:

  1. 在 Visual Studio 中创建 BizTalk 项目,并为要调用的所有操作生成架构。

  2. 手动创建一个架构文件,其中包含对在上一步中生成的所有架构的引用。

  3. 在 BizTalk 项目中创建消息,以便从 Oracle 数据库发送和接收消息。 这些消息必须符合在上一步中创建的请求和响应架构。

  4. 创建业务流程以调用 Oracle 数据库上的复合操作。

  5. 生成和部署 BizTalk 项目。

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

  7. 启动 BizTalk 应用程序。

    本主题提供有关如何执行这些任务的说明。

生成架构

在本主题中,为了演示如何执行复合操作,我们将按相同的顺序执行以下任务:

  • 将记录插入 ACCOUNTACTIVITY 表。

  • 通过在 ACCOUNT_PKG 包中调用GET_ALL_ACTIVITY过程,检索 ACCOUNTACTIVITY 表中的所有记录。

  • 从 ACCOUNTACTIVITY 表中删除记录。

    运行随示例一起提供的脚本以创建 ACCOUNTACTIVITY 表。 有关示例的详细信息,请参阅 架构示例

    必须创建 BizTalk 项目并使用“使用适配器服务加载项”生成架构。 有关如何生成架构的详细信息,请参阅 在 Visual Studio 中检索 Oracle 数据库操作的元数据

创建复合架构定义

现在必须在 Visual Studio BizTalk 项目中创建一个复合架构,该架构引用为单个操作创建的架构。 执行以下步骤来创建复合架构定义。

添加复合架构定义

  1. 将架构文件添加到 Visual Studio 中的 BizTalk 项目。 右键单击解决方案名称,指向 “添加”,然后单击“ 新建项”。 在“ 添加新项 ”对话框中的“ 类别 ”框中,单击“ 架构文件”。 在 “模板 ”框中,单击“ 架构”。 指定架构文件的名称,然后单击“ 确定”。

    对于此示例,将架构文件名指定为 CompositeSchema.xsd

  2. 添加对为要执行的不同操作生成的架构的引用。 在此示例中,为操作生成的不同架构包括:

    • OracleDBBinding.xsd,用于对 ACCOUNTACTIVITY 表执行插入和删除操作。

    • OracleDBBinding2.xsd,用于GET_ALL_ACTIVITY过程。

      添加引用:

    1. 右键单击 CompositeSchema.xsd 中的根 <架构> 节点,然后单击“ 属性”。

    2. 在“属性”框中,单击“导入”属性 (...) 省略号按钮。

      导入架构定义

    3. 在“ 导入 ”对话框中,从“ 将新架构导入为 ”列表中,选择“ XSD 导入”,然后单击“ 添加”。

    4. “BizTalk 类型选取器 ”对话框中,展开 BizTalk 项目名称节点,展开 “架构”,然后选择要导入的架构。 对于此示例,请选择“ <BizTalk_project_name>”。OracleDBBinding.xsd。 单击 “确定”

      重复此步骤以导入 <BizTalk_project_name>。OracleDBBinding2.xsd 也一样。

    5. 在“ 导入 ”对话框中,单击“ 确定”。

  3. 将两个子节点添加到根架构节点。 一个子节点对应于执行复合操作的请求架构。 另一个子节点对应于响应架构。 与请求架构相对应的节点可以具有任何名称。 与响应架构相对应的节点必须request_schema_node>响应调用<。 对于此示例,我们将请求架构节点称为 Request。 因此,响应架构节点称为 RequestResponse

    注意

    默认情况下, 节点也会添加到新的架构文件中。 可以将 节点重命名为 “请求”。 若要重命名节点,请右键单击节点名称,然后单击“ 重命名”。

    “架构>”节点下<添加节点:

    1. 右键单击“架构”<>节点,指向“插入架构节点”,然后单击“子记录”。

    2. 将新节点重命名为 RequestResponse

  4. “请求” 节点下添加子节点,这些节点对应于将作为复合操作一部分执行的每个操作的请求架构。 对于此示例,必须添加对应于以下内容的子节点:

    • 对 ACCOUNTACTIVITY 表执行插入和删除操作。

    • GET_ALL_ACTIVITY过程。

    重要

    必须按照要执行操作的相同顺序添加节点。 例如,如果要插入记录,则执行存储过程,然后删除记录,必须先为 Insert 操作添加一个节点,然后为存储过程添加一个节点,最后添加一个用于 Delete 操作的节点。

    将子节点添加到 “请求 ”节点:

    1. 右键单击“ 请求 ”节点,指向“ 插入架构节点”,然后单击“ 子记录”。

      58992131-13a6-45c3-9513-5c0995091fae插入架构

    2. 重命名记录,以对应于作为复合操作一部分执行的操作的请求架构。 例如,将节点重命名为“Insert”。

    3. Insert 节点映射到 ACCOUNTACTIVITY 表上 Insert 操作的请求架构。 为此,请右键单击“ 插入 ”节点,然后单击“ 属性”。 在 “属性” 框中,从“ 数据结构类型 ”列表中选择“ 插入 (引用) ”。

      映射子节点以请求架构

    4. 重复这些步骤,为GET_ALL_ACTIVITY存储过程和删除操作的请求架构添加节点。 指定节点名称并将其映射到下表中提到的相应架构。

      节点名称 映射到架构
      GET_ALL_ACTIVITY GET_ALL_ACTIVITY (参考)
      删除 删除 (引用)
  5. RequestResponse 节点下添加子节点,这些节点对应于将作为复合操作一部分执行的每个操作的响应架构。 对于此示例,必须添加对应于以下内容的子节点:

    • 对 ACCOUNTACTIVITY 表执行插入和删除操作。

    • GET_ALL_ACTIVITY存储过程。

    重要

    必须按照与 请求 节点下的子节点相同的顺序添加子节点。

    将子节点添加到 RequestResponse 节点:

    1. 右键单击 RequestResponse 节点,指向 “插入架构节点”,然后单击“ 子记录”。

    2. 重命名记录,使其对应于作为复合操作的一部分执行的操作的响应架构。 例如,将节点重命名为“InsertResponse”。

    3. InsertResponse 节点映射到 ACCOUNTACTIVITY 表上的 Insert 操作的响应架构。 为此,请右键单击“ InsertResponse ”节点,然后单击“ 属性”。 在 “属性 ”框中的“ 数据结构类型 ”列表中,选择“ InsertResponse (引用) ”。

    4. 重复这些步骤,为GET_ALL_ACTIVITY存储过程和 Delete 操作的响应架构添加节点。 指定节点名称并将其映射到下表中提到的相应架构。

      节点名称 映射到架构
      GET_ALL_ACTIVITYResponse GET_ALL_ACTIVITYResponse (参考)
      DeleteResponse DeleteResponse (参考)
  6. 保存 CompositeSchema.xsd 文件。

定义消息和消息类型

在上一步中创建的复合架构描述了业务流程中消息所需的“类型”。 消息通常是一个变量,其类型由相应的架构定义。 现在必须为业务流程创建消息,并将其链接到在上一步中创建的架构。

  1. 在 Visual Studio 中将业务流程添加到 BizTalk 项目。 从 解决方案资源管理器,右键单击 BizTalk 项目名称,指向“添加”,然后单击“新建项”。 键入 BizTalk 业务流程的名称,并单击“ 添加”。

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

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

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

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

    使用此选项 要执行此操作
    标识符 键入 Request
    消息类型 从下拉列表中展开“ 架构”,然后选择“ Composite_Op.CompositeSchema.Request”,其中“Composite_Op”是 BizTalk 项目的名称。 CompositeSchema 是为复合操作手动创建的架构。
  6. 重复步骤 2 以创建新消息。 在新邮件的“ 属性 ”窗格中,执行以下操作:

    使用此选项 要执行此操作
    标识符 键入 Response
    消息类型 从下拉列表中展开“ 架构”,然后选择 “Composite_Op.CompositeSchema.RequestResponse”。

设置业务流程

必须创建 BizTalk 业务流程才能使用 BizTalk Server 在 Oracle 数据库上执行复合操作。 在此业务流程中,会在定义的接收位置放置请求消息。 请求消息必须符合前面创建的复合架构。 Oracle 数据库适配器使用此消息并将其传递到 Oracle 数据库。 来自 Oracle 数据库的响应将保存到另一个位置。 必须包含“发送和接收”形状,才能分别将消息发送到 Oracle 数据库和接收响应。 用于执行复合操作的基本业务流程如下所示:

业务流程到 peform 复合操作

添加消息形状

请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是刚才提到的业务流程中显示的消息形状的名称。

形状 形状类型 属性
ReceiveMessage 接收 - 将 Name 设置为 ReceiveMessage
- 将 “激活” 设置为 “True”
SendMessage 发送 - 将 “名称” 设置为 SendMessage
ReceiveResponse 接收 - 将 Name 设置为 ReceiveResponse
- 将 “激活” 设置为 “False”
SendResponse 发送 - 将 “名称” 设置为 SendResponse

添加端口

请确保为每个逻辑端口指定以下属性。 “端口”列中列出的名称是业务流程中显示的端口名称。

端口 属性
MessageIn - 将 标识符 设置为 MessageIn
- 将 Type 设置为 MessageInType
- 将 通信模式 设置为 单向
- 将 通信方向 设置为 接收
LOBPort - 将 标识符 设置为 LOBPort
- 将 Type 设置为 LOBPortType
- 将 通信模式 设置为 请求-响应
- 将 通信方向 设置为 “发送-接收”
ResponseOut - 将 标识符 设置为 ResponseOut
- 将 Type 设置为 ResponseOutType
- 将 通信模式 设置为 单向
- 将 “通信方向 ”设置为 “发送”

指定操作形状的消息,并将其连接到端口

下表指定了应设置的属性及其值,以便为操作形状指定消息并将消息链接到端口。 “形状”列中列出的名称是前面提到的业务流程中显示的消息形状的名称。

形状 属性
ReceiveMessage - 将 消息 设置为 请求
- 将 操作 设置为 MessageIn.CompositeOp.Request
SendMessage - 将 消息 设置为 请求
- 将 操作 设置为 LOBPort.CompositeOp.Request
ReceiveResponse - 将 消息 设置为 响应
- 将 操作 设置为 LOBPort.CompositeOp.Response
SendResponse - 将 消息 设置为 响应
- 将 操作 设置为 ResponseOut.CompositeOp.Request

指定这些属性后,消息形状和端口将连接,并且业务流程完成。

现在,必须生成 BizTalk 解决方案并将其部署到BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程

配置 BizTalk 应用程序

部署 BizTalk 项目后,前面创建的业务流程将列在BizTalk Server管理控制台的“业务流程”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关演练,请参阅 演练:部署基本 BizTalk 应用程序

配置应用程序涉及:

  • 为应用程序选择主机。

  • 将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此业务流程,必须:

    • 定义硬盘上的位置和相应的文件端口,你将在其中删除请求消息。 BizTalk 业务流程将使用请求消息并将其发送到 Oracle 数据库。

    • 在硬盘上定义一个位置和相应的文件端口,BizTalk 业务流程将在其中删除包含 Oracle 数据库的响应的响应消息。

    • 定义物理 WCF-Custom 或 WCF-OracleDB 发送端口以将消息发送到 Oracle 数据库。 由于作为复合操作一部分的操作在单个事务中执行,因此请确保 UseAmbientTransaction 绑定属性设置为 True

      还必须在发送端口中指定操作。 复合操作的操作为“<http://Microsoft.LobServices.OracleDB/2007/03/CompositeOperation”。> 有关如何创建端口的信息,请参阅 手动配置到 Oracle 数据库适配器的物理端口绑定。 有关如何为端口指定操作的详细信息,请参阅 为 Oracle 数据库配置 SOAP 操作

      注意

      使用使用适配器服务 BizTalk 项目加载项生成架构还会创建一个绑定文件,其中包含有关端口的信息以及要为这些端口设置的操作。 可以从 BizTalk Server 管理控制台导入此绑定文件,为出站呼叫创建发送端口 () ,或接收入站呼叫) 的端口 (。 有关详细信息,请参阅 使用到 Oracle 数据库的端口绑定文件配置物理端口绑定。 如果导入此绑定文件,则发送端口上的操作将设置为动态操作,涉及生成架构时在“使用适配器服务加载项”中选择的所有操作。 对于复合操作,必须将动态操作替换为“<http://Microsoft.LobServices.OracleDB/2007/03/CompositeOperation”。>

启动应用程序

必须启动 BizTalk 应用程序才能对 Oracle 数据库执行复合操作。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程

在此阶段,请确保:

  • 用于接收业务流程请求消息的 FILE 接收端口正在运行。

  • 用于从业务流程接收响应消息的 FILE 发送端口正在运行。

  • WCF-Custom 或 WCF-OracleDB 发送端口以将消息发送到 Oracle 数据库正在运行。

  • 操作的 BizTalk 业务流程正在运行。

执行操作

运行应用程序后,必须将请求消息删除到 FILE 接收位置。 请求消息的架构必须符合前面创建的复合操作的架构。 例如,在 ACCOUNTACTIVITY 表中插入记录、调用GET_ALL_ACTIVITY存储过程并从 ACCOUNTACTIVITY 表中删除记录的请求消息为:

<Request xmlns="http://Composite_Op.CompositeSchema">  
  <Insert xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY">  
    <RECORDSET>  
      <ACCOUNTACTIVITYRECORDINSERT>  
        <TID>1</TID>  
        <ACCOUNT>100001</ACCOUNT>  
        <AMOUNT>1500</AMOUNT>  
        <DESCRIPTION></DESCRIPTION>  
        <TRANSDATE>2008-06-21T15:52:19</TRANSDATE>  
        <PROCESSED>n</PROCESSED>  
      </ACCOUNTACTIVITYRECORDINSERT >  
    </RECORDSET>  
  </Insert>  
  <GET_ALL_ACTIVITY xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG"/>  
  <Delete xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY">  
    <FILTER>WHERE AMOUNT = 1500</FILTER>  
  </Delete>  
</Request>  

前面的请求消息首先插入一条记录,然后调用GET_ALL_ACTIVITY过程来获取 ACCOUNTACTIVITY 表中的所有记录。 然后,通过指定 FILTER 子句删除插入的记录。 有关使用 Oracle 数据库 适配器对 Oracle 数据库执行复合操作的请求消息架构的详细信息,请参阅复合操作的消息架构。

业务流程使用消息并将其发送到 Oracle 数据库。 Oracle 数据库的响应保存在定义为业务流程的一部分的其他 FILE 位置。 例如,Oracle 数据库对上述请求消息的响应类似于以下内容:

<?xml version="1.0" encoding="utf-8" ?>   
<RequestResponse xmlns="http://Composite_Op.CompositeSchema">  
  <InsertResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOOT/Table/ACCOUNTACTIVITY">  
    <InsertResult>1</InsertResult>   
  </InsertResponse>  
  <GET_ALL_ACTIVITYResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Package/ACCOUNT_PKG">  
    <ALLRECS>  
      <xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
        <xs:element msdata:IsDataSet="true" name="NewDataSet">  
          <xs:complexType>  
            <xs:sequence>  
              <xs:element minOccurs="0" maxOccurs="unbounded" name="NewTable">  
                <xs:complexType>  
                  <xs:sequence>  
                    <xs:element minOccurs="0" name="TID" type="xs:decimal" />   
                    <xs:element minOccurs="0" name="ACCOUNT" type="xs:decimal" />   
                    <xs:element minOccurs="0" name="AMOUNT" type="xs:decimal" />   
                    <xs:element minOccurs="0" name="DESCRIPTION" type="xs:string" />   
                    <xs:element minOccurs="0" name="TRANSDATE" type="xs:dateTime" />   
                    <xs:element minOccurs="0" name="PROCESSED" type="xs:string" />   
                  </xs:sequence>  
                </xs:complexType>  
              </xs:element>  
            </xs:sequence>  
          </xs:complexType>  
        </xs:element>  
      </xs:schema>  
      <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">  
        <NewDataSet xmlns="">  
          <NewTable>  
            ......   
            ......   
          </NewTable>  
          ......  
          ......  
          <NewTable>  
            <TID>10</TID>   
            <ACCOUNT>100001</ACCOUNT>   
            <AMOUNT>1000</AMOUNT>   
            <TRANSDATE>2008-07-28T21:39:57</TRANSDATE>   
            <PROCESSED>n</PROCESSED>   
          </NewTable>  
        </NewDataSet>  
      </diffgr:diffgram>  
    </ALLRECS>  
  </GET_ALL_ACTIVITYResponse>  
  <DeleteResponse xmlns="http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY">  
    <DeleteResult>1</DeleteResult>   
  </DeleteResponse>  
</RequestResponse>  

前面的响应包含多个结果集,这些结果集对应于作为复合操作的一部分执行的不同操作。 例如, InsertResult 元素包含“1”,指示 Insert 操作插入的行数。 同样, DeleteResult 元素包含“1”,指示 Delete 操作删除的行数。

重要

如果在执行复合操作时遇到超时问题,可能是因为连接数小于复合操作中的操作数,涉及:

  • 包含 BFILE、BLOB、CLOB、NCLOB 和 REF CURSOR 作为 OUT 或 IN OUT 参数的存储过程。

    • 选择操作。

    若要解决此问题,必须确保如果复合操作中有“n”个此类操作,则为 MinPoolSize 绑定属性指定的值为“n+1”或更大。 有关 MinPoolSize 绑定属性的详细信息,请参阅 使用绑定属性

最佳实践

部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,这样就无需为同一业务流程创建发送端口和接收端口等项。 有关绑定文件的详细信息,请参阅 重用 Oracle 数据库适配器绑定

另请参阅

使用 Oracle 数据库开发 BizTalk 应用程序的构建基块