用 Data Studio Developer 在 DB2 z/OS 上调试存储过程,第 1 部分: 用 IBM Data Studio Developer v1.2 调试 DB2 for z/OS SQL 存储过程

DB2® 中的 Unified Debugger 和 Data Studio Developer 组合在一起提供一个出色的工具集,可以用来创建 SQL 原生或外部存储过程以及 Java™ 存储过程。本文提供关于 Unified Debugger 的重要背景信息,详细讲解如何使用 Data Studio Developer 创建和调试一个示例原生 SQL 存储过程。此外,还讨论常见的问题。本文主要关注 DB2 for z/OS® 存储过程,但是在其他 DB2 服务器上许多概念和步骤是相似的。

Tom Miller, 高级软件工程师, WSO2 Inc

Tom MillerTom Miller 是在 San Jose 的 IBM Silicon Valley Laboratory 工作的高级软件工程师,早在 1982 年就加入了 IBM。自 2001 年以来,Tom 一直是 DB2 for z/OS 开发团队的成员,负责 SQL 存储过程技术的研发。Tom 是 IBM Unified Debugger 开发团队的成员,负责把 Unified Debugger 技术引入 DB2 for z/OS 上的 Java 和 SQL 过程。在担任当前职位之前,Tom 是 QMF 架构师。



Emily Zhang, 顾问软件工程师, WSO2 Inc

Emily ZhangEmily Zhang 是 IBM Application Development Tooling 组织的顾问软件工程师,在加州 San Jose 的 IBM Silicon Valley Laboratory 工作。她是 IBM Data Studio 开发团队的成员。她的专业领域包括日常工具开发和 Unified Debugger。



2009 年 6 月 04 日

简介

IBM Data Studio Developer V1.2 包含一个 Unified Debugger 客户机,支持调试 SQL 存储过程。如果您熟悉用 Eclipse 平台调试应用程序,会发现调试 DB2 SQL 过程的步骤是很相似的。在本文中,介绍如何使用 IBM Data Studio Developer V1.2 中的调试特性调试一个示例 DB2 for z/OS SQL 存储过程。本文中的许多步骤也可以应用于在 DB2 for Linux®, UNIX®, and Windows® 和 DB2 for i 上创建的 SQL 存储过程。本文中使用的示例存储过程专门针对 DB2 for z/OS v9。

要想从本文获得最大收益,您应该熟悉使用 IBM Data Studio Developer 创建数据库连接以及操作表和存储过程等数据库对象。熟悉 IBM Data Studio Developer 的好方法是下载试用版并阅读它的教程系列(见 参考资料)。

了解不同 DB2 版本中的调试器技术

DB2 for z/OS 有两种 IBM 调试器技术:

  • 老式技术称为 SQL Debugger,支持 DB2 for z/OS V8(包含与 LUW V8 FP7 同时发布的 V8 PTF UK03933)。它只为外部 SQL 存储过程提供调试器支持。
  • Unified Debugger 是最新的调试器技术,支持 DB2 for z/OS V8(包含与 DB2 for Linux, UNIX, and Windows V9 FP2 同时发布的 PTF UK25860)和 DB2 for z/OS V9。对于 DB2 for z/OS V8,可以使用 Unified Debugger 调试外部 SQL 存储过程。但是,对于 DB2 for z/OS V9,它支持调试 Java 存储过程、原生 SQL 过程和外部 SQL 存储过程。

这两种技术之间的主要差异是,Unified Debugger 同时支持调试 Java 和 SQL 过程,而且继续支持调试嵌套的过程调用。本文讨论 Unified Debugger。

准备示例表

本文中创建的存储过程是用原生 SQL 编写的,以商品 ID 作为输入,使用 PRODUCT 表中存储的成本、送货费用和客户付款信息计算商品的利润。存储过程的输出称为 PROFIT,这一数据被存储回 PRODUCT 表。

清单 1 给出创建和填充 PRODUCT 表所需的 DDL。如果希望检验过程中的 SQL 语句,需要先运行这个 DDL。

清单 1. 创建示例 product 表的 DDL
CREATE TABLE ADMF001.PRODUCT 
( 
 ITEM VARCHAR(6) NOT NULL,
 COST DECIMAL(8,2), 
 SHIPPING DECIMAL(8,2),
 PAYMENT DECIMAL(8,2),
 PROFIT DECIMAL(8,2)
 );

INSERT INTO ADMF001.PRODUCT (ITEM, COST, SHIPPING, PAYMENT)
  VALUES ('001', 100.00, 19.99, 150);

INSERT INTO ADMF001.PRODUCT (ITEM, COST, SHIPPING, PAYMENT)
  VALUES ('002',80, 8.99, 99.99);

创建和部署存储过程

在本节中,使用 Stored Procedure 向导生成示例存储过程的简单版本。需要修改生成的存储过程,添加计算利润的逻辑。然后,学习如何指定在启用调试选项的情况下部署存储过程。如果不这样做,就无法调试存储过程。

创建过程

调试现有的存储过程

如果在服务器上有任何现有的 SQL 存储过程,那么可以把它从 Database Explorer 拖入数据开发项目中,然后进行调试。但是,需要确保存储过程为调试做好了准备,这意味着存储过程在部署时要启用调试选项。

如果存储过程在部署时没有 启用调试选项,就无法调试它;必须选择 Enable debugging 并再次部署它。

按照以下步骤创建名为 PROFITUPDATE 的示例存储过程:

  1. 首先,在 Data Studio Developer 中使用 DB2 for z/OS 数据库连接创建一个新的数据开发项目。选择 File > New > Data Development Project。向导要求指定一个数据库连接。如果还没有数据库连接,那么可以使用数据库连接向导创建一个 DB2 for z/OS 数据库连接。
    图 1. 选择数据库连接
    创建新项目,创建或选择数据库连接
  2. 接下来,使用 New Stored Procedure 向导创建一个 SQL 存储过程。可以右键单击刚才创建的项目,选择 New > Stored Procedure(见图 2),从而启动 New Stored Procedure 向导。把存储过程命名为 PROFITUPDATE 并指定原生 SQL 作为它的语言。
    图 2. 创建新的 SQL 存储过程
    创建新的 SQL 存储过程
  3. 在 SQL Statements 页面上,在 Statement details 框中添加清单 2 所示的 SQL 语句。注意,变量名前面有一个冒号 (:),这把它定义为主机变量。
    清单 2. PROFITUPDATE 存储过程的 SQL 语句
    SELECT COST, SHIPPING, PAYMENT FROM PRODUCT 
    			WHERE ITEM = :itemID;
    图 3. SQL Statements 页面
    SQL Statements 页面
  4. 单击 Validate 按钮检查 SQL 语法。如果语法有错误,它会在把语句写入过程之前指出错误。另外,它还帮助格式化 SQL 语句。图 3 给出检查之后语句的样子。单击 Next
  5. 在 Parameters 页面上(图 4),会注意到已经基于主机变量 :itemID 创建了输入变量 itemID。在这个页面上,可以修改现有的参数、添加新参数和删除不再需要的参数。
    图 4. Parameters 页面
    Parameters 页面
  6. 现在,必须通过单击 Add… 按钮添加第二个参数(输出参数)。这个参数名为 itemProfit,模式为 OUT。类型为 Decimal (8,2),见图 5。单击 OK
    图 5. 添加参数
    添加参数
  7. 在向导的 Deploy Options 页面上,可以通过选中 Enable debugging 复选框启用调试,见图 6。单击 Finish
    图 6. 确保选中 Enable debugging 复选框
    选中 Enable debugging 复选框

现在,应该会在图 6-1 所示的编辑器中打开创建的存储过程。

图 6-1. 生成的过程
生成的存储过程

在查看源代码时,会注意到它不包含计算利润的逻辑。需要修改存储过程的过程体,添加这种逻辑。为了节省时间,可以复制并粘贴清单 3 所示的示例过程体。

清单 3. 计算利润的存储过程
CREATE PROCEDURE PROFITUPDATE ( IN itemID VARCHAR(6),
                                OUT itemProfit DECIMAL(8, 2) )
	VERSION VERSION1 
	ISOLATION LEVEL CS 
	LANGUAGE SQL
	ALLOW DEBUG MODE 
	WLM ENVIRONMENT FOR DEBUG MODE WLMENV1
	QUALIFIER ADMF001
	COMMIT ON RETURN YES
------------------------------------------------------------------------
-- SQL Stored Procedure 
	-- itemID  
	-- itemProfit 
------------------------------------------------------------------------
P1: BEGIN
	-- Declare variables
	
	DECLARE itemPayment DECIMAL(8,2) DEFAULT 0.0;
	DECLARE total_cost DECIMAL(8,2) DEFAULT 0.0;
	
	P2: BEGIN
		DECLARE itemCost DECIMAL(8,2) DEFAULT 0.0;
		DECLARE itemShippingFee DECIMAL(8,2) DEFAULT 0.0;
		
		-- Declare cursor
		DECLARE cursor1 CURSOR FOR
			SELECT COST, SHIPPING, PAYMENT FROM PRODUCT 
			WHERE ITEM = itemID;

		OPEN cursor1;
		
		FETCH cursor1 INTO itemCost, itemShippingFee, itemPayment;
		SET total_cost = itemCost + itemShippingFee;
		
	END P2;
	
	SET itemProfit = itemPayment - total_cost;
	UPDATE PRODUCT SET PROFIT = itemProfit 
		WHERE ITEM = itemID;
END P1

单击 Save 保存存储过程。现在要部署存储过程了。

部署存储过程

为了部署存储过程,在 Data Project Explorer 中右键单击过程并选择 Deploy。因为前面在创建这个过程时启用了调试,它在部署时会启用调试选项。如果还没有启用调试选项,仍然可以在部署向导的 Routine Options 部分中选中 Enable debugging 复选框(图 7)。

图 7. Deploy Routines 向导中的 Enable debugging 选项
Deploy Routines 向导中的 Enable debugging 选项

设置调试器会话管理程序

在调试存储过程之前,了解调试器框架会有帮助。Unified Debugger 有三个组件:服务器、客户机和会话管理程序,见图 8。在这个框架中,客户机与会话管理程序通信,会话管理程序与服务器通信,从而交换调试信息和请求。

图 8. Unified Debugger 框架
Unified Debugger 框架

可以看出会话管理程序非常重要,它是一个中间件,负责通过 TCP/IP 连接协调客户机和服务器之间的通信。在使用调试器之前,需要在网络上某个地方(客户机、服务器或其他地方)启动会话管理程序进程。如果还没有正确地设置它,那么由于会话管理程序不可用,在使用 IBM Data Studio Developer 时会遇到问题(图 9),因此无法使用 Unified Debugger。

图 9. 会话管理程序不可用
会话管理程序不可用

如果在环境中的服务器上运行会话管理程序,就不需要在客户端做任何设置。但是,服务器端设置很复杂(尤其是在 z/OS 环境中),所以本文只关注在客户端上使用调试器,服务器端设置留到另一篇文章中讨论。同时,建议通过 参考资料 中列出的 Redbook 了解为存储过程调试设置 DB2 for z/OS 环境的信息。

如果会话管理程序不在本地运行,应该怎么办?

如果会话管理程序在网络上的某个地方运行,那么仍然可以使用本节描述的步骤,但是需要找到驻留它的服务器上的 db2dbgm.bat。

使用会话管理程序的最简便方法是在客户机上运行它,然后配置 debugger Preferences 页面。在客户机上运行会话管理程序的步骤如下:

  1. 找到 Data Studio Developer v1.2 附带的会话管理程序。这个文件名为 db2dbgm.bat。它位于以下目录中:
    [DS install directory] \dsdev\bin
  2. 在命令提示窗口中执行 db2dbgm.bat。它会提供一个主机 IP 地址和端口号,您应该记住它们。它的设置还包括超时信息。图 10 所示的 db2dbgm.bat 示例输出表明,如果会话管理程序空闲了 50 分钟,它就会超时。(指定零值表示没有会话管理程序超时)。可以通过编辑 db2dbgm.bat 修改空闲时间和端口号。
    图 10. 启动会话管理程序并获得 IP 地址和端口号
    启动会话管理程序并获得 IP 地址和端口号
  3. 既然已经得到了正在运行的会话管理程序的 IP 地址和端口号,就需要在调试器首选项的会话管理程序部分中输入这些信息:
    1. 选择 Window>Preferences…
    2. Run/Debug > DB2 Stored Procedure Debugger 下面找到 debugger preferences 页面。
    3. 单击 debugger preferences 页面上的 Use already running session manager 单选按钮,输入前面记下的 IP 地址和端口号。
    图 11. 在首选项中指定会话管理程序的 IP 地址和端口号
    在首选项中指定会话管理程序的 IP 地址和端口号

注意:不要关闭会话管理程序窗口,因为这会结束会话管理程序会话。因此,应该继续调试并让会话管理程序窗口在后台运行。

设置其他调试器首选项

除了会话管理程序之外,还可以在开始调试之前配置其他调试器首选项。本节简要介绍其中两个选项,见图 12。

图 12. DB2 存储过程调试器首选项
DB2 存储过程调试器首选项
  • Inactivity setting:在让调试器停在一个断点上时,如果不执行任何进一步的调试操作,就认为调试是空闲的。为了避免无限期地持有服务器资源,调试器假设在经过指定的无活动时间段之后应该结束调试,让过程自动地运行完。可以在 Debugger preference 页面上指定调试器的无活动时间长度。默认值是 300 秒。
  • Error trace setting:为了帮助判断问题,IBM 服务代表可能要求您在服务器上启用诊断跟踪。值 2 在 DB2 服务器上启用完整的诊断跟踪。除非 IBM 服务代表明确要求启用服务器诊断跟踪,否则应该保持这个设置为 0(零)。

可选:在进行调试之前设置运行设置

最后,作为开始调试之前的最后一个可选步骤,指定应用于本次运行的设置,包括:

  • 指定在调试之前或之后运行的某些 SQL 语句(对这些语句不进行调试)
  • 设置一个输入参数值
  • 指定是否把更改提交到数据库
  • 为 DB2 for z/OS 连接设置集合 ID

示例存储过程在最后更新 PRODUCT 表。为了检查更新,可以用一个运行后语句显示对 PRODUCT 表执行 SELECT 语句的结果。本节介绍具体做法。

  1. 在 Data Project Explorer 中右键单击存储过程并选择 Run Settings,打开 Run Settings 对话框,见图 13。
    图 13. Run settings 菜单
    Run settings 菜单
  2. Run settings 窗口有多个选项卡。选择 After Run 选项卡并输入 select * from PRODUCT 语句,见图 14。
    图 14. Run settings 对话框窗口
    Run settings 对话框窗口

在运行或调试存储过程之后,会执行这个 SQL 语句。利润更新的结果会显示在输出视图中。

注意:在 Run Settings 对话框中,还可以在 Parameter Values 选项卡中指定参数值。但是,如果不在这里指定,在调试过程中仍然有机会指定参数值。


开始调试

现在,已经完成了所有设置活动,可以开始调试存储过程了。

  1. 开始调试的方法是在 Data Project Explorer 中右键单击存储过程名,然后选择 Debug…,见图 15。
    图 15. 在 Data Project Explorer 中从过程启动调试器
    在 Data Project Explorer 中从过程启动调试器
  2. 调试器首先启动标准的 Eclipse 调试配置页面,见图 16。所有配置项都预先设置了。单击 Debug 继续。
    图 16. 调试配置页面
    调试配置页面
  3. 因为示例存储过程有一个输入变量,所以调试器会打开 Specify Parameter Values 对话框,可以在其中输入参数值。如果前面在 Run Settings 对话框中输入了参数值,这个值会再次显示出来,可以检查或修改它。
    图 17. Specify Parameter Values 对话框
    Specify Parameter Values 对话框
  4. 调试在 Debug 透视图中进行。下面的窗口要求您确认切换到 Debug 透视图。单击 Yes 继续。还可以单击复选框让它记住您的决定,这样就不会再提示确认。
    图 18. 切换到 Debug 透视图
    切换到 Debug 透视图

现在,调试器开始工作了。在存储过程逻辑前面包含 PROCEDURE 关键字的行上总是设置一个隐含的断点。当前位置用一个箭头突出显示。可以让过程停在任何执行行上进行调试。如果设置了任何断点,还可以一直运行到下一个有效断点。

图 19. 调试器停在第一行上
调试器停在第一行上

调试器透视图、视图和操作

Eclipse Debug 透视图(图 20)提供几个帮助调试存储过程的视图。本节介绍这些视图。

  • Debug 视图
  • Variables 视图
  • Breakpoints 视图
  • Data Output 视图
图 20. Debug 透视图概况
Debug 透视图概况

Debug 视图

Debug 视图显示当前的调用堆栈。它提供存储过程名和当前行号。在 Debug 视图中,可以通过图 21 所示的工具栏执行不同的操作,包括 Step Into、Step Over、Step Return、Resume 和 Terminate:

图 21. Debug 视图及其操作
Debug 视图及其操作
  • 使用 Step Over 逐行调试过程。
  • 使用 Step Into 调试嵌套的过程。如果没有嵌套的过程,那么它的作用与 Step Over 相同。
  • Step Return 帮助从嵌套的过程返回。如果当前不在嵌套的过程中,那么 Step Return 运行完整个过程,忽略所有断点。
  • 当停在某一行上时,可以使用 Resume 执行到下一个有效的断点。如果后面没有有效的断点,就一直运行到过程结束并停止调试。
  • 使用 Terminate 在任何时候停止调试。
  • 最后,可以通过单击这个图标删除所有终止的运行:

关于嵌套过程的提示:如果有嵌套的过程调用,Debug 视图可以提供外层过程和嵌套过程的调试信息,包括每个过程中的当前行号。

图 22 给出一个调试嵌套的存储过程的示例,其中的 Procedure1 调用 Procedure2。在调用 procedure2(var1) 的行上,如果选择 step into 操作,调试器就会进入 Procedure2 内部,从第一行开始调试 Procedure2。在调用堆栈上可以看到,Procedure2 现在出现在 Procedure1 上面。调试完 Procedure2 之后,调试器回到 Procedure1。

图 22. 调试嵌套的存储过程
调试嵌套的存储过程

Variables 视图

Variables 视图(图 23)显示当前可用的变量和参数的当前值。Unified Debugger 还显示 SQLCODE 和 SQLSTATE 诊断信息。

图 23. Variables 视图
Variables 视图

在 Variables 视图中可以:

  • 指定变量修改断点。
  • 把所有变量值复制并粘贴到其他文件。
  • 根据调试的需要修改变量值。可以双击变量值并输入新值,也可以右键单击变量并从弹出菜单中选择 Change Value…,见图 24。
图 24. 在 Variables 视图中查看并修改变量
在 Variables 视图中查看并修改变量

不能修改诊断信息 SQLCODE 或 SQLSTATE 的值,也不能在它们上面设置变量修改断点。它们不同于一般的变量。

Breakpoints 视图

Breakpoints 视图显示已经为存储过程设置的所有断点。Breakpoints 视图提供标准的断点管理支持,包括:

  • 启用/禁用断点
  • 删除断点
  • 导入/导出断点

Unified Debugger 支持两种断点:行断点和变量修改断点。在下图中,Breakpoints 视图显示这两种断点。

图 25. Breakpoints 视图
Breakpoints 视图

添加新断点:在编辑器中双击一行右边的空白边,就会在这一行上设置行断点。还可以右键单击编辑器的左边,然后使用出现的 Add Breakpoint 菜单设置行断点。

图 26. Add Breakpoint 菜单
Add Breakpoint 菜单

如果在包含有效 SQL 过程执行语句的行上设置了断点,在调试期间调试器可以停在这一行上。某些源代码行和 SQL 过程语句不能设置断点,比如注释行或游标声明。另外,每个 SQL 过程语句只有一个为语句定义可中断点的关键字。一般情况下,有效的断点是 SQL 过程语句的第一个关键字。在为跨多个源代码行的语句设置断点时要小心。可以通过 Step Over 操作熟悉这些有效断点位置。

图 27. 行断点
行断点

可以在 Variables 视图中设置变量修改断点。在 Variables 视图中,右键单击一个变量并选择 Add Variable Change Breakpoint。调试期间,当变量值改变时,调试器会停在修改变量的行上。

图 28. 创建变量修改断点
创建变量修改断点

Data Output 视图

Data Output 视图显示调试完成时过程的结果。结果与正常运行存储过程时的结果相同。它提供调试操作的状态信息、运行消息、参数值和运行结果。Data Output 视图有助于检查运行存储过程的结果。如果结果不符合预期,可以重新调试存储过程。

对于我们的示例存储过程,第二个商品(item 002)的利润是 11.00。利润值显示在 Data Output 视图的 Parameters 选项卡中的 OUT 模式参数 itemProfit 中。

图 29. Data Output 视图 - 调试操作的结果
Data Output 视图 - 调试操作的结果

还记得在 Run Settings 中如何设置运行后语句吗?运行后语句的执行结果也显示在 Data Output 视图中。如图 30 所示,Results 选项卡中列出了 PRODUCT 表的内容。表中 item 002 的利润值是 11.00。

图 30. Data Output 视图 – 运行后语句的执行结果
Data Output 视图 – 运行后语句的执行结果

需要了解的其他问题

到目前为止,已经了解了如何为调试准备会话管理程序、如何创建存储过程、如何在启用调试选项的情况下部署它以及如何通过检查变量值和结果来调试它。本节讨论在 DB2 for z/OS 上进行调试时常常出现的一些情况。

无法找到会话管理程序

正如前面提到的,可以在客户机、服务器或网络上的其他地方设置会话管理程序。有时候,即使设置了会话管理程序,IBM Data Studio Developer 仍然报告会话管理程序不可用。

如果遇到这样的问题,而且您的会话管理程序在服务器或网络上的其他地方运行,那么可能是防火墙阻断了 TCP/IP 连接。另外,有时候是由于 IP 地址不正确。检查 TCP/IP 连接路径是否通畅的好方法是从服务器 ping 会话管理程序的 IP 地址。

超时问题

Unified Debugger 使用两个 超时设置。一个用于调试客户机;另一个用于会话管理程序。如果会话管理程序在指定的时间段内没有为调试会话服务,它就会关闭。要想再次使用会话管理程序,就必须重新启动它。调试客户机会释放一段时间内无活动的调试会话。一定要根据自己的需要调整这两个设置。

调试器菜单未启用

有时候,调试器菜单被禁用了。下面两种情况会导致这个问题:

  • 首先,可能没有在启用调试选项的情况下部署存储过程。可以在编辑器中打开过程,然后检查是否选中了 Enable Debugging 复选框。
  • 第二,数据库连接可能不支持调试器。正如前面提到的,对于在带 PTF UK03933 的 V8 上启动的 DB2 for z/OS,提供调试器支持。如果连接到 DB2 for z/OS V7,就无法在 Data Studio Developer V1.2 中调试存储过程。

结束语

IBM Data Studio Developer 为 SQL 存储过程提供调试特性,允许在 Eclipse 框架中按照与调试 Java 应用程序相似的方式进行调试。本文介绍了如何对 DB2 for z/OS 上的 SQL 存储过程进行调试,但是许多概念也适用于其他 DB2 服务器。

致谢

我们衷心感谢 Kathy Zeidenstein、Tina Chen 和其他审阅者为审阅本文提供帮助!

参考资料

学习

获得产品和技术

讨论

条评论

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=Information Management
ArticleID=394209
ArticleTitle=用 Data Studio Developer 在 DB2 z/OS 上调试存储过程,第 1 部分: 用 IBM Data Studio Developer v1.2 调试 DB2 for z/OS SQL 存储过程
publish-date=06042009