Oracle 数据库适配器使适配器客户端能够在 Oracle 数据库上执行复合操作。 复合操作可以包括:
- 对表和视图进行插入、更新、删除和查询操作。 
- 存储在包内或包外的过程和函数。 - 单一复合操作可以按任意顺序包含任意数量的此类操作。 例如,您可以先执行两次插入操作,然后是一次删除操作,最后执行一个存储过程。 此外,还可以对不同的数据库表或视图执行不同的操作。 有关适配器如何支持复合作的详细信息,请参阅 在 Oracle 数据库中执行复合作。 有关复合作的 SOAP 消息结构的信息,请参阅 复合作的消息架构。 
如何在 Oracle 数据库上执行复合操作?
使用 Oracle 数据库适配器与 BizTalk Server 配合在 Oracle 数据库上执行操作,涉及 构建基块中所述的过程任务,以开发使用 Oracle 数据库的 BizTalk 应用程序。 若要对 Oracle 数据库执行复合操作,以下任务是:
- 在 Visual Studio 中创建一个 BizTalk 项目,并为您要调用的所有操作生成架构。 
- 手动创建一个架构文件,其中包含对上一步中生成的所有架构的引用。 
- 在 BizTalk 项目中创建消息,以便从 Oracle 数据库发送和接收消息。 这些消息必须符合在上一步中创建的请求和响应架构。 
- 创建一个编排过程以调用 Oracle 数据库上的复合操作。 
- 生成和部署 BizTalk 项目。 
- 通过创建物理发送和接收端口来配置 BizTalk 应用程序。 
- 启动 BizTalk 应用程序。 - 本主题提供有关如何执行这些任务的说明。 
生成架构
在本主题中,为了展示如何执行复合操作,我们将按相同的顺序执行以下任务:
- 将记录插入 ACCOUNTACTIVITY 表中。 
- 通过在 ACCOUNT_PKG 包中调用GET_ALL_ACTIVITY过程来检索 ACCOUNTACTIVITY 表中的所有记录。 
- 从 ACCOUNTACTIVITY 表中删除记录。 - 运行随示例一起提供的脚本以创建 ACCOUNTACTIVITY 表。 有关示例的详细信息,请参阅 架构示例。 - 必须创建一个 BizTalk 项目,并使用“消费适配器服务插件”来生成架构。 有关如何生成架构的详细信息,请参阅 在 Visual Studio 中为 Oracle 数据库操作检索元数据。 
创建复合架构定义
现在,您必须在 Visual Studio BizTalk 项目中创建一个复合架构,该架构引用您为各个操作创建的架构。 执行以下步骤来创建复合架构定义。
添加复合架构定义
- 将架构文件添加到 Visual Studio 中的 BizTalk 项目。 右键单击解决方案名称,指向 “添加”,然后单击“ 新建项”。 在“ 添加新项 ”对话框中的“ 类别 ”框中,单击“ 架构文件”。 在 “模板 ”框中,单击“ 架构”。 指定架构文件的名称,然后单击“ 确定”。 - 对于此示例,请将架构文件名指定为 - CompositeSchema.xsd.
- 为您希望执行的不同操作添加生成的架构引用。 在此示例中,针对操作生成的不同架构包括: - OracleDBBinding.xsd,用于对 ACCOUNTACTIVITY 表进行插入和删除操作。 
- OracleDBBinding2.xsd,用于GET_ALL_ACTIVITY过程。 - 添加引用: 
 - 右键单击 CompositeSchema.xsd 中的根 <架构> 节点,然后单击“ 属性”。 
- 在“属性”框中,针对 Imports 属性单击省略号按钮(...)。   
- 在“ 导入” 对话框中,从 “导入新架构” 列表中选择 “XSD 导入”,然后单击“ 添加”。 
- 在 BizTalk 类型选取器 对话框中,展开 BizTalk 项目名称节点,展开 “架构”,然后选择要导入的架构。 对于此示例,请选择 <BizTalk_project_name>。OracleDBBinding.xsd。 单击 “确定” 。 - 重复此步骤以导入 <BizTalk_project_name>。OracleDBBinding2.xsd 也是。 
- 在“ 导入 ”对话框中,单击“ 确定”。 
 
- 将两个子节点添加到根架构节点。 一个子节点对应于执行复合操作的请求方案。 另一个子节点对应于响应架构。 与请求架构对应的节点可以具有任何名称。 与响应架构相对应的节点必须被命名为<request_schema_node>响应。 对于此示例,我们将请求架构节点称为 请求。 因此,响应架构节点称为 RequestResponse。 - 注释 - 默认情况下, 根 节点也会添加到新的架构文件中。 可以将 根 节点重命名为 “请求”。 若要重命名节点,请右键单击节点名称,然后单击“ 重命名”。 - 在<架构>节点下添加节点时, - 右键单击 <架构> 节点,指向 “插入架构节点”,然后单击“ 子记录”。 
- 将新节点重命名为 RequestResponse。 
 
- 在请求节点下添加与作为复合操作一部分执行的每个操作的请求架构对应的子节点。 对于此示例,必须添加对应于以下内容的子节点: - 在 ACCOUNTACTIVITY 表上进行插入和删除操作。 
- GET_ALL_ACTIVITY过程。 
 - 重要 - 必须按照与要执行操作相同的顺序添加节点。 例如,如果要插入记录,然后执行存储过程,然后删除记录,必须先添加插入作的节点,然后添加存储过程的节点,最后是删除作的节点。 - 将子节点添加到 请求 节点: - 右键单击 “请求 ”节点,指向 “插入架构节点”,然后单击“ 子记录”。  为架构  插入子节点 为架构  插入子节点
- 将记录重命名为符合您作为复合操作一部分执行的操作的请求模式。 例如,将节点重命名为“Insert”。 
- 将Insert节点映射到ACCOUNTACTIVITY表上的Insert操作请求架构。 为此,请右键单击 “插入 ”节点,然后单击“ 属性”。 在“属性”框中,从“数据结构类型”列表中选择“插入”(引用)。   
- 重复这些步骤,为GET_ALL_ACTIVITY存储过程和删除操作的请求架构添加节点。 指定节点名称,并将其映射到下表中所述的相应架构。 - 节点名称 - 映射到架构 - 获取所有活动 - GET_ALL_ACTIVITY(参考) - 删除 - 删除(参考) 
 
- 在 RequestResponse 节点下添加子节点,这些子节点对应于作为复合操作的一部分执行的每个操作的响应架构。 对于此示例,必须添加对应于以下内容的子节点: - 在 ACCOUNTACTIVITY 表上进行插入和删除操作。 
- GET_ALL_ACTIVITY存储过程。 
 - 重要 - 必须按照 请求节点下 子节点的顺序添加子节点。 - 将子节点添加到 RequestResponse 节点: - 右键单击 RequestResponse 节点,指向 “插入架构节点”,然后单击“ 子记录”。 
- 将记录重命名以对应您作为复合操作的一部分执行的操作的响应架构。 例如,将节点重命名为“InsertResponse”。 
- 将 InsertResponse 节点映射到 ACCOUNTACTIVITY 表上的 Insert 操作的响应架构。 为此,请右键单击 InsertResponse 节点,然后单击“ 属性”。 在“属性”框中,从“数据结构类型”列表中,选择“InsertResponse”(引用)。 
- 重复这些步骤,为GET_ALL_ACTIVITY存储过程和删除操作的响应架构添加节点。 指定节点名称,并将其映射到下表中所述的相应架构。 - 节点名称 - 映射到架构 - GET_ALL_ACTIVITYResponse - GET_ALL_ACTIVITYResponse(参考) - 删除响应 - DeleteResponse (参考) 
 
- 保存 CompositeSchema.xsd 文件。 
定义消息和消息类型
在上一步中创建的复合架构描述了业务流程中消息所需的“类型”。 消息通常是变量,类型由相应的架构定义。 现在必须为编排创建消息,并将其链接到在上一步中创建的架构。
创建消息并链接到架构
- 在 Visual Studio 中向 BizTalk 项目添加一个业务流程编排。 在解决方案资源管理器中,右键单击 BizTalk 项目名称,指向 “添加”,然后单击“ 新建项”。 键入 BizTalk 业务流程的名称,然后单击“ 添加”。 
- 打开 BizTalk 项目的“业务流程视图”窗口(如果尚未打开)。 为此,请单击“ 视图”,指向 “其他窗口”,然后单击“ 业务流程视图”。 
- 在业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。 
- 右键单击新创建的消息,然后选择“ 属性窗口”。 
- 在Message_1的“属性”窗格中,执行以下作: - 用这个 - 要执行的操作 - 标识符 - 类型 - Request- 消息类型 - 在下拉列表中,展开 “架构”,然后选择 “Composite_Op.CompositeSchema.Request”,其中Composite_Op是 BizTalk 项目的名称。 CompositeSchema 是您为复合操作手动创建的模式。 
- 重复步骤 2 以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作: - 用这个 - 要执行的操作 - 标识符 - 类型 - Response- 消息类型 - 从下拉列表中展开“模式”,然后选择“Composite_Op.CompositeSchema.RequestResponse”。 
设置业务流程
必须开发 BizTalk 编排才能使用 BizTalk Server 在 Oracle 数据库上执行组合操作。 在此业务流程中,会在定义的接收位置投递请求消息。 请求消息必须符合之前创建的复合架构。 Oracle 数据库适配器使用此消息并将其传递到 Oracle 数据库。 Oracle 数据库的响应将保存到另一个位置。 必须包含“发送和接收”形状,才能将消息分别发送到 Oracle 数据库和接收响应。 执行复合操作的基本编排如下:
               
              
            
添加消息形状
请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。
| 形状 | 形状类型 | 性能 | 
|---|---|---|
| 接收消息 | 接收 | - 将 名称 设置为 ReceiveMessage - 将 “激活 ”设置为 True | 
| 发送消息 | 发送 | - 将 名称 设置为 SendMessage | 
| 接收响应 | 接收 | - 将 名称 设置为 ReceiveResponse - 将 “激活 ”设置为 False | 
| SendResponse | 发送 | - 将 名称 设置为 SendResponse | 
添加端口
请确保为每个逻辑端口指定以下属性。 端口列中列出的名称是在编排中显示的端口的名称。
| 港口 | 性能 | 
|---|---|
| MessageIn | - 将 标识符 设置为 MessageIn - 将 类型 设置为 MessageInType - 将 通信模式 设置为 单向 - 将通信方向设置为接收 | 
| LOBPort | - 将 标识符 设置为 LOBPort - 将 类型 设置为 LOBPortType - 将 通信模式 设置为 请求-响应 - 将 通信方向 设置为 发送接收 | 
| ResponseOut | - 将 标识符 设置为 ResponseOut - 将 类型 设置为 ResponseOutType - 将 通信模式 设置为 单向 - 将通信方向设置为发送 | 
指定动作形状的消息,并将其连接到端口
下表列出了为操作形状指定消息及将消息链接到端口时需要设置的属性及其值。 Shape 列中列出的名称是前文提到的业务编排中显示的消息形状的名称。
| 形状 | 性能 | 
|---|---|
| 接收消息 | - 将 消息 设置为 请求 - 将操作设置为MessageIn.CompositeOp.Request | 
| 发送消息 | - 将 消息 设置为 请求 - 将 操作 设置为 LOBPort.CompositeOp.Request | 
| 接收响应 | - 将 消息 设置为 响应 - 将 操作 设置为 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 数据库适配器绑定。