扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
1. @echo off
2. if {%2} =={} goto setlog
3. set LogFile=%2
4. goto exe
5. rem 如果没有指定输出文件,设置默认输出文件
6. :setlog
7. set LogFile=logs\run.log
8.
9. :exe
10. echo %LogFile%
11. echo --------------------- execute file:%1-------------------- >> %LogFile%
12. db2 values(current time) >> %LogFile%
13. db2 -td@ -f %1 -z %LogFile%
14. db2 values(current time) >> %LogFile%
15. pause
|
其中 –td@ 选项表示 SQL 文件中各 SQL 语句间的分割符为 @。–z 选项可以使 sql 的执行结果输出到指定的 Log 文件中。这里我们使用 -z 而不使用脚本中的管道符号(>)是因为 -z 不仅可以把执行结果记录到指定的文件中,同时还会在控制台上显示,这样即方便我们在执行 sql 的时候实时掌握 sql 运行情况,又可以在 log 中查找分析 sql 执行情况。
该脚本需要两个参数,第一个参数指明要执行的 sql 文件,第二个参数指明 log 文件名称,该参数可选。在脚本的第 12 行,第 14 行,我们使用 values(current time) 来记录脚本执行的开始时间和结束时间。这样可以帮助我们计算出脚本执行完毕需要多长时间。
第 3 个批处理脚本的作用是获得表定义,包括字段属性、主键、前 20 条记录,如果是视图,显示其创建语句,并显示视图中包含的表。如清单 3 所示。它的使用方法是 viewtable schema tablename。
1. @echo off
2. mkdir logs
3. set logfile=logs\view_%2.txt
4. db2 describe table %1.%2 show detail >%logfile%
5. echo -----------------------below is (are) pk------------------------- >>%logfile%
6. db2 "select substr(colname,1,30) as pk from syscat.columns
where keyseq is not null and tabschema=upper('%1')
and tabname = upper('%2')" >>%logfile%
7. echo ---------------below are the fisrt 20 rows in the %1.%2 table---- >>%logfile%
8. db2 select * from %1.%2 fetch first 20 rows only >>%logfile%
9. echo -----------------------below is the sql of the %1.%2 view --------- >>%logfile%
10. db2 "select varchar(text,32670) from syscat.views
where viewschema=upper('%1')and viewname = upper('%2')" >>%logfile%
11. echo ---------------below are tables of the %1.%2 view --------- >>%logfile%
12. db2 "select distinct bname from syscat.viewdep
where viewname= upper('%1') and btype='T'" >>%logfile%
13. start %logfile%
|
脚本中第 4 行的 describe 命令用于显示数据库表或视图的结构。包括字段名称,数据类型等。第 6 行用于查出表中的主键。视图 syscat.columns 中的 keyseq 字段表明了该字段在表的主键的顺序,为空表示该字段不是表的主键。第 8 行是获得表或视图中的前 20 条记录,便于我们对其分析。第 10 行是获得视图的 SQL 定义。第 12 行获得视图中依赖的表。
第 4 个批处理脚本的作用是查看存储过程或 UDF 的定义。如清单 4 所示。它的使用方法是 view spname。
1. @echo off
2. set logfile=logs\view_%1.sql
3. db2 select varchar(text,32670) from syscat.routines
where routinename=upper('%1') > %logfile%
4. echo -----------------------below are tables used by %1 --------- >>%logfile%
5. db2 select bname from syscat.packagedep
where (btype='T' or btype='V') and pkgname in
(select bname from sysibm.sysdependencies where dname =upper('%1')) >> %logfile%
6.
7. start %logfile%
|
在脚本中我们之所以使用 VARCHAR 函数来格式 TEXT 字段中的内容,是因为 TEXT 字段是 CLOB 类型,其存储的存储过程或 UDF 的创建语句的字符比较多。如果我们不使用 VARCHAR 函数进行格式化,DB2 就会使用默认的 CHAR 函数(CHAR 的最大长度是 254)对其格式化,这样返回的 SQL 创建语句就可能被截去后面的部分。
第 5 行中脚本首先获得依赖某存储过程的所有的包(package)名,然后查找依赖这些包的所有的表和视图。这样就可以获得存储过程中使用的表和视图。
第 4 个批处理脚本的作用是使用脚本获得依赖某个表的所有存储过程,UDF 和视图。如清单 5 所示。它的使用方法是 dep schema spname。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。