扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者