在 IBM WebSphere Cast Iron Studio 中调用一个返回结果集的存储过程

了解如何使用 CopyOf 函数和 XML 架构在 IBM® WebSphere® Cast Iron Studio 中访问一个数据库存储过程的结果。

Katherine Sanders, 软件工程师, IBM

Katherine Sanders 是位于英国的 IBM Hursley Park 的一名软件工程师。她为 WebSphere Application Server 开发和测试 Web 服务,并重点关注 WS-Addressing、WS-ReliableMessaging 和 WS-Notification。她从诺丁汉大学获得计算机科学硕士学位。



2012 年 7 月 02 日

简介

IBM WebSphere Cast Iron Studio(以下简称 Studio)用于开发调用数据库存储过程的业务流程。存储过程通常返回一个包含 SQL 选择语句结果的结果集,而不指定各个字段的名称和类型。在这些情况下,IBM WebSphere Cast Iron Cloud Integration(以下简称 Cast Iron)开发人员必须创建一个 XML 架构来告诉 Studio 有关结果的结构。本教程解释如何创建 XML 架构并提供一个详细的示例。

先决条件

本教程面向应用程序开发人员。其中包含样例应用程序开发各个阶段的详细步骤,所以即使初学者也能完成该开发。不过,事先对 Extensible Markup Language (XML)、XML 架构和 Extensible Stylesheet Language Transformations (XSLT) 标准有一定了解会加深您对本教程的理解。

系统要求

本教程使用以下软件:

  • IBM WebSphere Cast Iron Studio V6.1.0.3 或更高版本
  • IBM DB2® V9.7 或更高版本
  • Microsoft™ Windows™ V7 或更高版本

时长

阅读本教程需要用大约 1 到 2 个小时。


创建数据库对象

在开始开发业务流程之前,您必须创建一些要在数据库中使用的样例对象。在开发过程中它们会在 Studio 中用到。它们也将包含一些用于测试的样例数据。

创建用户帐户

通常出于审计目的,会在 Cast Iron 会连接到的每个端点系统上创建一个专有的用户帐户。DB2 使用操作系统来进行身份验证,因此您必须创建一个新的 Windows 用户:

  1. 通过选择 Start > Control Panel > Administrative Tools > Computer Management 创建一个名为 castiron 的测试 Windows 用户。展开 Local UsersGroups,然后右键单击 Users > New User,如图 1 所示。
    图 1. 创建一个新用户
    创建一个新用户
  2. 输入用户名、密码并确认密码。取消选中 “User must change password at next logon” 框并单击 Create 按钮,如图 2 所示。
    图 2. 新用户配置
    新用户配置

创建一个数据库

需要一个数据库来包含存储过程以及用于测试的一些样例数据。

  1. 从 Windows 的 Start 菜单启动 DB2 Control Center。右键单击 All Databases > Create Database > Standard 创建一个名为 CASTIRON 的测试数据库,如图 3 所示。
    图 3. 创建一个标准数据库
    创建一个标准数据库
  2. 输入数据库名称为 castiron,如图 4 所示,然后单击 Finish
    图 4. 指定一个数据库名称
    指定一个数据库名称
  3. 等待数据库被创建,然后右键单击数据库 CASTIRON > Authorities 授予用户 castiron 连接和创建表的权限,如图 5 所示。
    图 5. 数据库 CASTIRON 权限
    数据库 CASTIRON 权限
  4. 单击 Add User 按钮,选择 CASTIRON > OK,然后选择 CASTIRON。将 CONNECT 设置为 Yes,将 CREATETAB 设置为 Yes,如图 6 所示。
    图 6. 授予权限给用户 CASTIRON
    授予权限给用户 CASTIRON

创建存储过程、表和测试数据

需要一个存储过程来返回一条 SQL 选择语句的结果。而且需要一个表和一些测试数据来供 SQL 选择语句执行查询。

本教程提供的 样例脚本 完成以下任务:

  • 以 CASTIRON 用户身份连接到数据库 CASTIRON,提示用户输入密码。
  • 创建一个名为 CAST_IRON_FORM_FACTORS 的表,其中有三列:ID、NAME 和 CREATE_DATE。
  • 插入三行测试数据到新表中。
  • 创建一个名为 GET_CAST_IRON_FORM_FACTORS 的存储过程,返回根据 ID 排序的新表的内容。

使用以下步骤运行脚本:

  1. 打开 Windows 命令提示符。
  2. 使用 cd 命令导航到包含样例脚本的目录。
  3. 运行命令 db2cmd 以打开 DB2 命令窗口。
  4. 在 DB2 窗口运行命令 db2 -td@ -vf sample.sql 来运行样例脚本。

开发 Cast Iron 业务流程

现在创建好了样例数据库表和存储过程之后,就可以开始开发调用存储过程的 Cast Iron 业务流程了。本文提供完成的 样例项目 以及创建该项目所需的 XML 架构文件。

创建项目和业务流程

所有 Studio 开发都是在一个项目内完成的。每个项目包含一个或多个业务流程,每个业务流程包含一系列定义数据流的活动。在本教程中,您将使用以下步骤创建一个新项目:

  1. 启动 Studio。
  2. 单击简介窗格上的 Create Project 链接,如图 7 所示。
    图 7. 从简介窗格创建一个新项目
    从简介窗格创建一个新项目
  3. 输入 Project Name 为 StoredProcedureSample,选择一个 Project Directory 位置,然后单击 OK,如图 8 所示。然后新项目打开,其中有一个名为 Orchestration 的新业务流程。
    图 8. 输入文件名和目录
    输入文件名和目录
  4. 在界面右边的工具箱中右键单击并选择 Rename 来重命名业务流程,如图 9 所示。
    图 9. 重命名业务流程
    重命名业务流程
  5. 如图 10 所示,输入名称 CallStoredProcedure 并按下 Enter
    图 10. 新业务流程名称
    新业务流程名称
  6. 通过按下 CTRL+s 保存项目。

创建数据库端点

一个数据库端点封装 Cast Iron 将用于连接到数据库的连接细节。使用以下步骤创建一个新数据库端点:

  1. 单击工具栏中的 New Endpoint 按钮,如图 11 所示。
    图 11. 创建一个新端点
    创建一个新端点
  2. 在出现的上下文菜单中单击 Database,如图 12 所示。
    图 12. 创建一个新数据库端点
    创建一个新数据库端点
  3. 将 Database Type 选为 DB2 UDB,并输入 DB2 数据库的名称、服务器、端口、用户名、密码和包集合,如图 13 所示。
    图 13. 输入数据库连接细节
    输入数据库连接细节
  4. 单击界面底部的 Test Connection 按钮,确认您已经正确输入了细节。图 14 显示一条成功确认消息。
    图 14. 测试数据库连接
    测试数据库连接
  5. 单击界面顶部选项卡中的 “x” 关闭数据库端点。
  6. Save the project by pressing CTRL+s.

创建 Call Procedure 活动

现在您要创建一个 Call Procedure 活动来调用一个数据库存储过程。

  1. 确保 CallStoredProcedure 业务流程打开了。
  2. Call Procedure 活动从工具箱中的活动选项卡拖放到界面中央工作区中业务流程的 Add Starter Activity 部分(参见图 15)。注意,Call Procedure 不是一个 starter 活动,不过本教程稍后将添加一个。
    图 15. 创建一个 Call Procedure 活动
    创建一个 Call Procedure 活动
  3. 活动是使用包含任务览表工作区下面的配置窗格加以配置的。在该活动的览表中最初有两个旁边有警告标志的任务。警告标志表示有信息丢失或无效。单击第一个带有警告标志的任务,即 Pick Endpoint 任务,如图 16 所示。
    图 16. Call Procedure 活动览表
    Call Procedure 活动览表
  4. 注意到 Database 字段旁边有一个警告标志,因为值丢失了。单击 Database 字段右边的 Browse 按钮,如图 17 所示。
    图 17. Pick Endpoint 任务配置
    Pick Endpoint 任务配置
  5. 选择您之前创建的 Database 端点并单击 OK,如图 18 所示。
    图 18. 选择 Database 端点
    选择 Database 端点
  6. 注意到从您选择的数据库端点加载了数据库连接细节。而且 Pick Endpoint 旁边的警告被替换为一个绿色对勾符号,表示配置有效,如图 19 所示。单击活动览表中的 Stored Procedure 任务。
    图 19. Pick Endpoint 任务完成
    Pick Endpoint 任务完成
  7. 注意到,因为值缺失,Stored Procedure 字段旁边有一个警告符号。单击 Stored Procedure 字段右边的 Browse 按钮。
    图 20. Stored Procedure 任务配置
    Stored Procedure 任务配置
  8. 确保选中 User Schema 旁边的 CASTIRON 并单击 Search ,如图 21 所示。注意到 GET_CAST_IRON_FORM_FACTORS 存储过程显示出来,如图 21 所示。
    图 21. 浏览存储过程
    浏览存储过程
  9. 确保选中 GET_CAST_IRON_FORM_FACTORS 并单击 OK,如图 22 所示。Studio 从数据库获取有关存储过程的元数据,并使用它来填充输入和输出参数列表(在本例中什么都没有)。Cast Iron 使用的数据库对象必须预先创建,这样才能在 Studio 中浏览。
    图 22. 存储过程参数
    存储过程参数
  10. 注意到 Stored Procedure 任务旁边的警告符号被替换为一个绿色对勾符号,不再有警告符号了。单击 Map Outputs 任务,会看到存储过程返回一个名为 resultSets 的循环节点。但是不提供该节点内元素的细节。
    图 23. 观察 Map Outputs 任务中的输出类型
    观察 Map Outputs 任务中的输出类型
  11. 按下 CTRL+s 保存项目。

调用存储过程来发现结果结构

需要有一个 XML 架构来将结果集结构告知 Studio,然后才能映射各个元素。要创建这一架构,调用 Call Procedure 活动来查看返回结果的结构。

  1. 右键单击工作区中的 Call Procedure 活动,并从出现的上下文菜单中选择 Verify Activity,如图 24 所示。
    图 24. 验证 Call Procedure 活动
    验证 Call Procedure 活动
  2. Create Assets 窗口出现。默认情况下,Cast Iron 被配置为只向存储过程交付一次信息,并且数据库中需要有一个控制表以供 Cast Iron 内部使用。如果您不希望在您的数据库中创建一个控制表,可以在览表中的 Delivery Rules 任务中将 Deliver Message 改为 “at least once”。选择存储过程旁边的复选框并单击 Create,如图 25 所示。
    图 25. 创建资产
    创建资产
  3. 单击对话框中的 OK(图 26),确认资产得到成功创建。
    图 26. 资产创建成功对话框
    资产创建成功对话框
  4. 单击 Create Assets 对话框中的 Continue,然后单击工具箱中的 Verify 选项卡来查看结果。展开 Instance #1 树,查看 Call Procedure 活动的 Map Outputs 任务使用的变量值。在本例中没有 Map Inputs,因为存储过程没有任何输入参数。单击 Map Outputs 任务内的结果变量(图 27),显示存储过程调用返回的 XML。每个数据库行都有一个行元素,每个数据库列都有一个序号列。另外还有 SQL 脚本插入到列元素中的值。
    图 27. 验证结果
    验证结果

创建 XML 架构

您必须创建一个与上述存储过程返回结果完全匹配的 XML 架构,以存储来自数据库的结果。但是,要让业务流程在未来更加容易维护,列元素应当有与数据库列相匹配的名称。因此,您需要创建另一个架构,使用 column1、column2 和 column3 以外的更合适的名称,以供稍后映射使用。

  1. 打开一个外部文本编辑器并创建一个名为 “results.xsd” 的文件。
  2. 复制清单 1 中与结果结构完全匹配的 XML 架构,并将其粘贴到 results.xsd 中。
    清单 1. results.xsd
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="results" type="ResultsType"/>
      <xs:complexType name="ResultsType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="result" type="ResultType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="resultSets" 
           type="ResultSetsType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultSetsType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="resultSet" type="ResultSetType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultSetType">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" minOccurs="0" name="row" type="RowType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="RowType">
        <xs:sequence>
          <xs:element name="column1" type="xs:int"/>
          <xs:element name="column2" type="xs:string"/>
          <xs:element name="column3" type="xs:dateTime"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
  3. 创建另一个名为 “resultsWithColumnNames.xsd” 的文件。
  4. 复制清单 2 中更新了列元素名称的 XML 架构,并将其粘贴到 resultsWithColumnNames.xsd 中。
    清单 2. resultsWithColumnNames.xsd
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="results" type="ResultsType"/>
      <xs:complexType name="ResultsType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="result" type="ResultType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="resultSets" 
           type="ResultSetsType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultSetsType">
        <xs:sequence>
          <xs:element maxOccurs="1" minOccurs="1" name="resultSet" 
           type="ResultSetType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ResultSetType">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" minOccurs="0" name="row" 
           type="RowType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="RowType">
        <xs:sequence>
          <xs:element name="id" type="xs:int"/>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="create_date" type="xs:dateTime"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
  5. 单击 Studio 工具箱中的 Project 选项卡。
  6. 单击工具栏中的 Add Document 按钮,如图 28 所示。
    图 28. 添加文档
    添加文档
  7. 在出现的上下文菜单中单击 XML Schema,如图 29 所示。
    图 29. 添加 XML 架构
    添加 XML 架构
  8. 单击 Browse 按钮,选择您在上面创建的 results.xsd 文件的位置,并单击 OK,如图 30 所示。
    图 30. 添加 results.xsd
    添加 results.xsd
  9. resultsWithColumnNames.xsd 文件重复第 6 到 8 步。之后,两个文件都会列出在 Project 选项卡的 XML 架构部分,如图 31 所示。
    图 31. 导入的 XML 架构
    导入的 XML 架构
  10. 按下 CTRL+s,保存项目。

完成 Call Procedure 活动

结果的 XML 架构现在已被导入到 Studio。您可以修改 Call Procedure 活动,将结果映射到一个 XML 变量,其中有您可以在稍后活动中操作的子元素。您必须使用 CopyOf 函数来执行这一映射,因为您不能访问左边 resultSets 的子元素。它将源代码的全部内容复制到目标节点。

  1. 单击工作区中的 Call Procedure 活动。
  2. 单击览表中的 Map Outputs 任务。
  3. 单击右边的 Select Outputs 按钮,如图 32 所示。
    图 32. 选择输出
    选择输出
  4. 单击 New 按钮,为结果创建一个新变量,如图 33 所示。
    图 33. 创建一个新输出变量
    创建一个新输出变量
  5. 选择结果 XML 架构下的结果,单击 Next 按钮,如图 34 所示。
    图 34. 从结果架构创建一个类型为 results 的变量
    从结果架构创建一个类型为 results 的变量
  6. 输入名称 results 并单击 Finish 按钮,如图 35 所示。
    图 35. 创建一个名为 results 的新变量
    创建一个名为 results 的新变量
  7. 选择新 results 变量并单击 OK,如图 36 所示。
    图 36. 选择新的 results 变量
    选择新的 results 变量
  8. 图 37 显示,Map Outputs 任务中提供了完整的 results 结构。
    图 37. Map Outputs 中的 results 变量
    Map Outputs 中的 results 变量
  9. 单击工具箱的 Functions 选项卡,并将 CopyOf 函数从 Miscellaneous 区域拖放到 Map Outputs 中间的白框区域,如图 38 所示。
    图 38. 将 CopyOf 函数添加到 Map Outputs
    将 CopyOf 函数添加到 Map Outputs
  10. 将映射左边的 results 变量拖放到 CopyOf 函数,以设置函数的输入变量,如图 39 所示。
    图 39. 设置 CopyOf 函数的输入参数
    设置 CopyOf 函数的输入参数
  11. CopyOf 函数 拖放到映射右边的 results 变量,以将函数的结果输出到该变量,如图 40 所示。
    图 40. 设置 CopyOf 函数的输出参数
    设置 CopyOf 函数的输出参数
  12. 右键单击 CopyOf 函数并选择 Apply Function Graph 完成映射,如图 41 所示。
    图 41. 应用函数图形
    应用函数图形
  13. 图 42 显示,映射显示为一条品洋红色的线。这一颜色表示映射不一定成功,因为源类型和目标类型不匹配。如果出现这样一条线,您可以忽略它。
    图 42. 映射不一定成功
    映射不一定成功
  14. 按下 CTRL+s 保存项目。

创建一个 Map Variables 活动来设置列名

Call Procedure 活动配置现在完成了。它调用存储过程并将输出存储在一个包含所有子元素的 results 变量中。现在您可以添加一个 Map Variables 活动来将结果中的 column1、column2 和 column3 映射到具有更适当名称的元素,使得便于识别哪些列元素包含哪些数据库列的数据。

  1. 单击工具箱中的 Activities 选项卡并展开 Transform 部分,以显示 Map Variables 活动,如图 43 所示。
    图 43. Transform 活动
    Transform 活动
  2. 在工作区中将 Map Variables 活动拖动到业务流程中 Call Procedure 活动的后面,如图 44 所示。
    图 44. 添加 Map Variables 活动后的业务流程
    添加 Map Variables 活动后的业务流程
  3. Map Variables 活动仅有一个任务,因此配置窗格中没有览表。单击左边的 Select Inputs 按钮,如图 45 所示。
    图 45. 选择输入
    选择输入
  4. 选择 results 变量并单击 OK,如图 46 所示。
    图 46. 选择 results 变量
    选择 results 变量
  5. 单击右边的 Select Outputs 按钮,如图 47 所示。
    图 47. 选择输出
    选择输出
  6. 单击 New 按钮,为具有列名的结果创建一个新变量,如图 48 所示。
    图 48. 创建一个新变量
    创建一个新变量
  7. 选择 resultsWithColumnNames XML 架构下的 results 类型并单击 Next 按钮,如图 49 所示。
    图 49. 从 resultsWithColumnNames 架构创建一个 results 类型的新变量
    从 resultsWithColumnNames 架构创建一个 results 类型的新变量
  8. 输入名称 resultsWithColumnNames 并单击 Finish 按钮,如图 50 所示。
    图 50. 创建变量 resultsWithColumnNames
    创建变量 resultsWithColumnNames
  9. 选择新的 resultsWithColumnNames 变量并单击 OK,如图 51 所示。
    图 51. 选择输出变量 resultsWithColumnNames
    选择输出变量 resultsWithColumnNames
  10. column1 元素拖到 id 元素,将 column2 元素拖到 name 元素,再将 column3 元素拖到 create_date 元素,如图 52 所示。这些映射显示为绿色,因为源类型和目标类型相匹配。
    图 52. 映射变量
    映射变量
  11. 按下 CTRL+s 保存项目。

创建一个 starter 活动

目前为止您调用了存储过程并将结果存储在一个变量中,该变量具有与数据库列对应的元素名称。但是,工具箱的 Project 选项卡中业务流程的旁边仍然有一个警告符号,因为每一个有效的业务流程都始于一个名为 “starter 活动” 的特殊类型活动。您将使用一个 Schedule Job 活动,该活动以指定的间隔定期启动一项作业(一项业务流程的一个运行时实例)。

  1. 单击工具箱中的 Activities 选项卡并展开 Utilities 部分,以显示 Schedule Job 活动,如图 53 所示。
    图 53. Utilities 活动
    Utilities 活动
  2. 在工作区中将 Schedule Job 活动拖放到业务流程中 Call Procedure 活动的前面,如图 54 所示。
    图 54. 添加 Schedule Job 活动之后的业务流程
    添加 Schedule Job 活动之后的业务流程
  3. 在配置窗格中览表的 Configure 任务中将间隔改为 every 5 seconds,如图 55 所示。这意味着在执行测试时,您只需等待 5 秒钟即可让业务流程运行。
    图 55. 设置时间间隔
    设置时间间隔
  4. 单击菜单栏下工具栏中的 Validate Project 按钮,如图 56 所示。
    图 56. 验证项目
    验证项目
  5. 注意到项目现在有效了。
    图 57. 验证成功
    验证成功
  6. 按下 CTRL+s 保存项目。

对整个业务流程执行单元测试

现在您有了一个 starter 活动,可以使用内置到 Studio 中的 Verify 功能对整个业务流程执行单元测试。

  1. 单击工具箱中的 Verify 选项卡,然后单击工具栏中的 Start Orchestration 按钮,如图 58 所示。
    图 58. 开始业务流程
    开始业务流程
  2. 单击 Create Assets 对话框中的 Continue 按钮,因为在验证 Call Procedure 活动时您已经创建了控制表。5 秒钟之后,业务流程将开始运行。
  3. 运行完成之后,展开 Instance #2 查看详细结果,如图 59 所示。单击 Map Variables 活动中的 resultsWithColumnNames 变量,确保已经成功重命名了列元素。
    图 59. 验证全部业务流程结果
    验证全部业务流程结果

后续步骤

在实际场景中,在从数据库获取了结果之后,您要修改该业务流程来处理结果。例如,可以使用 WriteXML 和 FTP Put File 活动将它们写到一个平面文件。一种好的做法是将 Try 活动添加到 Call Procedure 活动附近,以便处理在数据库端点不可用时或调用过程时发生的错误。

此外,您应当将业务流程发布到一个运行时环境中,使用更大的输入数据测试它。注意,数据库端点目前被配置为使用服务器本地主机,这在部署之后将不起作用。您应当将数据库连接参数转换为配置属性,这样就可以在部署后从 Web Management Console (WMC) 修改它们,而无需在 Studio 中更改项目。如果使用了一个不同的数据库,您需要从 WMC 重新创建资产。但是,所有这些步骤都不属于本教程讨论范围。请参阅 参考资料 部分,进一步阅读相关读物。


结束语

本教程展示了如何使用 WebSphere Cast Iron Studio 来开发一个业务流程,该业务流程每隔 5 秒钟运行一次,以调用存储过程并将结果存储在一个具有适当元素名称的变量中。


下载

描述名字大小
代码样例SampleApplication.zip22KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=823793
ArticleTitle=在 IBM WebSphere Cast Iron Studio 中调用一个返回结果集的存储过程
publish-date=07022012