在针对 DB2 存储过程的开发中,您是否觉得 DB2 提供的开发工具虽然功能强大,但是执行速度较慢,稍显笨重,而我们的日常开发中仅仅使用了一些比较常用的功能。你是否觉得虽然其工具操作起来比较直观,但是在处理大量创建、修改操作或者重复执行一些操作时就会比较费时?是否感觉使用其工具,无法方便的记录跟踪我们执行过的操作?如果您有上述的问题,本文会给您提供一个解决办法——使用 Windows 脚本进行 DB2 存储过程开发。脚本通常执行速度快捷,灵活;善于处理批量操作;以文本格式编写的脚本也方便我们查看具体我们执行了哪些操作。脚本的特点恰恰帮助我们解决了刚刚提到的问题。
本文主要讨论使用 Windows 脚本与 DB2 交互的一些常用技巧和方法。介绍了利用 Windows 的脚本(批处理程序)连接数据库,查询表结构,UDF之间的引用关系,存储过程中使用了哪些表等等。同时通过一个演示项目的开发过程的介绍来展示如何使用文中的脚本进行开发。
背景知识简介
Windows 脚本常用命令
Windows 脚本也称之为批处理程序,是一个包含了一些需要顺序执行的 Windows 命令的文本文件,其扩展名为 bat 或 cmd。由于本文的脚本需要传入参数,读者需要在控制台中执行本文提供的 Windows 脚本。
下面是 Windows 中的一些常用命令和符号。这里仅仅列出一些说明,如果想了解 Window 命令的详细信息,请参考本文提供的参考资料。
REM:行注释命令,它不会被执行,只是起一个注释的作用,便于代码的阅读和维护;
ECHO:命令主要参数有 OFF 和 ON,用于控制是否在控制台上显示正在执行的命令。也可以使用 ECHO message 来显示一个特定的消息;
GOTO: 即为跳转的意思。在脚本中以“:XXX”构建一个标号然后用GOTO XXX 来执行标号后的命令;
CALL: 命令用于在主脚本执行过程中调用子脚本,当子脚本执行完毕后再继续执行主脚本。如果我们不使用 CALL 来调用子脚本,而是在主脚本中直接调用子脚本,那么被调用的子脚本执行完毕,也就表示主脚本执行的完毕,主脚本后续的命令将不会被执行;
PAUSE: 暂时停止脚本的执行;
PROMPT: 修改命令提示符。PROMPT [text]。text 表示新的提示符。 $P 代表当前路径,$G 代表 >;
START: 打开一个新的窗口执行某个命令。如果 START 后面跟的是一个文件名,那么 Windows 会调用打开该种文件的程序将其打开。例如,如果你设定 notepad(记事本)为 *.log 文件的打开程序。那么执行 START my.log 命令后,Windows 会启动 notepad(记事本)程序,并且打开 my.log 文件;
符号(#):# 符号可以关闭当前命令行的回显。我们从上面知道用命令 echo off 可以关掉整个批处理的命令回显但却不能不显示 echo off 这个命令。现在我们在这个命令前加上 #,这样 echo off 这一命令就被 # 关闭了回显,从而达到所有命令均不回显的要求;
管道(输出重定向)命令 >和 >>:将命令输出的结果重定向到特定文件中, >与 >>的区别在于,>会清除文件中原来的内容,然后把输出结果写入文件,而 >>只会追加内容到文件中,而不会改动其中原有的内容;
Windows 脚本参数:我们可以向脚本传递参数,并且可以在脚本中通过 %n 来引用。脚本每次能处理的变量从 %0~%9 共 10 个。其中 %0 默认为批处理的文件名。
DB2 CLP 简介
DB2 mand Line Processor(DB2 CLP)是所有 DB2 产品中都有的,可以使用这个应用程序运行 DB2 命令、操作系统命令或 SQL 语句。DB2 CLP 可以成为强大的工具,因为它能够将经常使用的命令或语句序列存储在批处理文件中,可以在必要的时候运行这些批处理文件。在 Windows 系统中,必须先(从普通命令窗口)运行 db2cmd 命令来启动 DB2 命令行环境。
在什么时候使用本文介绍的脚本?
脚本的优势在于可以重复执行。如果一个任务会被执行多次,或者被多人执行。那么将该任务编写成脚本会提高任务的执行效率和准确性。本文介绍的脚本都是一些在我们进行存储过程开发和调试中经常用到的。读者在后面会渐渐体会到脚本给我们带来的便利。
DB2 系统表的功能
编写针对 DB2 的脚本,我们需要首先了解 DB2 为我们提供了哪些命令和信息。DB2 为我们提供了大量的命令例如连接数据库,执行一个 SQL 文件,获得表结构的信息等等。我们会在下面解释具体的脚本的同时对一些简单的 DB2 命令进行解释说明。同时,DB2 把数据库对象的很多信息都存储到了系统表中。熟悉这些系统表就能够通过 SQL 语句获得我们需要的信息。下面我们先来学习一下 DB2 系统表。
在 DB2 数据库被创建的时候,DB2 会创建一些系统表。这些系统表中记录了所有数据库对象的信息,表或视图的列的数据类型,约束的定义,对象的权限和对象之间的依赖关系等。这些系统表的模式为 SYSIBM,其表名以 SYS 作为前缀。例如: SYSTABLES、SYSVIEWS 等等。DB2 为这些系统表建立了相对应的只读视图。这些视图的模式是 SYSCAT,它们的内容是其相对应的系统表的全部或者部分内容。这些视图的名字没有 SYS 的前缀。例如:SYSCAT.TABLES 是 SYSIBM.SYSTABLES 的视图。
我们可以通过 LIST TABLES FOR SYSTEM 或 LIST TABLES FOR SCHEMA schemaname 命令查看所有的系统表和相关的视图信息。下面我们会介绍一些本文用到的系统表和视图。
SYSCAT.TABLES:数据库中对象的信息,包括 table,view,nickname 和 alias 的一些定义。详细说明见表 1。
表 1. SYSCAT.TABLES 视图的说明
列名数据类型描述
TABSCHEMAVARCHAR(128)记录 schema 的名字
TABNAMEVARCHAR(128)记录数据库对象的名称。包括表、视图、别名等
TYPECHAR(1)表示该数据库对象是表,视图还是别名 (’T’表示table; ’V’表示 view; ’N’ 表示nickname; ’A’ 表示 alias。)
COLCOUNTSMALLINT表或视图中列的个数
……
SYSCAT.VIEWS:视图的定义信息。详细说明见表 2。
表 2. SYSCAT.VIEWS 视图的说明
列名数据类型描述
VIEWSCHEMAVARCHAR(128)视图的 Schema
VIEWNAMEVARCHAR(128)视图名称
READONLYCHAR(1)视图是否只读:
Y = 视图是只读
N = 视图不是只读
VALIDCHAR(1)视图状态是否合法:
Y = 视图状态合法(valid)
X = 视图状态不合法(invalid)
TEXTCLOB (64K)视图的源程序(DDL)
……
SYSCAT.ROUTINES:DB2 UDF,系统方法(system-generated method),用户定义方法(user-defined method)和存储过程(SP)的定义。我们可以认为该视图包含了数据库中程序的定义。