DB2 for z/OS SQL 存储过程

简介

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 中调试存储过程。
  • 作者:Tom Miller, 高级软件工程师, IBM
    Emily Zhang, 顾问软件工程师, IBM

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-605282/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-605282/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DB2® 9 for z/OS® is an exciting new version, with many improvements in performance and little regression. DB2 V9 improves availability and security, as well as adds greatly to SQL and XML functions. Optimization improvements include more SQL functions to optimize, improved statistics for the optimizer, better optimization techniques, and a new approach to providing information for tuning. V8 SQL procedures were not eligible to run on the IBM® System z9® Integrated Information Processor (zIIP), but changing to use the native SQL procedures on DB2 9 makes the work eligible for zIIP processing. The performance of varying length data can improve substantially if there are large numbers of varying length columns. Several improvements in disk access can reduce the time for sequential disk access and improve data rates. The key DB2 9 for z/OS performance improvements include reduced CPU time in many utilities, deep synergy with IBM System z® hardware and z/OS software, improved performance and scalability for inserts and LOBs, improved SQL optimization, zIIP processing for remote native SQL procedures, index compression, reduced CPU time for data with varying lengths, and better sequential access. Virtual storage use below the 2 GB bar is also improved. This IBM Redbooks® publication provides an overview of the performance impact of DB2 9 for z/OS, especially performance scalability for transactions, CPU, and elapsed time for queries and utilities. We discuss the overall performance and possible impacts when moving from version to version. We include performance measurements that were made in the laboratory and provide some estimates. Keep in mind that your results are likely to vary, as the conditions and work will differ. In this book, we assume that you are somewhat familiar with DB2 V9. See DB2 9 for z/OS Technical Overview, SG24-7330, for an introduction to the new functions. In this book we have used the new official DB2 9 for z/OS abbreviated name for IBM Database 2 Version 9.1 for z/OS as often as possible. However, we have used the old DB2 V9 notation for consistency when directly comparing DB2 V9 to DB2 V8 or previous versions.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值