【需求】
在项目测试阶段,需要将所有表中值为null的字段抽取出来并进行统计。
【Solution】
由于DB2部署在AIX系统上,可以在shell环境下编写awk脚本程序对表扫描,抽取出对象字段。
【shell程序】
getNullItem.sh
#! /usr/bin/ksh
db2 connect to D3703H0 user d3703bth using d3703bth
db2 set current schema = DB2I3703
echo `date` > Output
for i in `cat tablelist`; do
db2 "describe table "$i | grep "はい"> itemIn.txt
awk 'BEGIN{ printf ("select ") > "sqlOut" }{ printf ("count(*) - count(%s) as %s件数,", $1, $1)>> "sqlOut" }' itemIn.txt
echo "count(*) from "$i >> sqlOut
echo $i >> Output
db2 `cat sqlOut` >> Output
done
echo `date` >> Output
-------------------------------------------------------------------------
上述程序中,cat tablelist是显示保存于文本文件tablelist中的表名,如下:
【tablelist】
T37A00F1
T37A00F2
T37A00F5
T37A00M9
T37A00MB
T37A00MC
T37A00MD
T37A00ME
T37A00MF
T37A00MG
......
最后,Output文件里的输出如下所示:
【Output】
Mon Feb 2 17:11:08 JST 2009
T37A00F1
HU1N6件数 KA4ZS件数 KA4ZT件数 RE0BK件数 KA4ZN件数 SI0D2件数 SI2UD件数 KI02F件数 KO00N件数 KO01A件数 11
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
0 0 0 0 0 0 0 0 0 0 31
1 レコードが選択されました。
T37A00F2
HU1N6件数 HU1MT件数 HU1OK件数 4
----------- ----------- ----------- -----------
0 0 0 0
1 レコードが選択されました。
T37A00F5
1
-----------
0
1 レコードが選択されました。
T37A00M9
SI2B9件数 KA08P件数 MI0H4件数 TO19V件数 SI44Q件数 SI0X6件数 7
----------- ----------- ----------- ----------- ----------- ----------- -----------
0 0 0 0 0 0 0
1 レコードが選択されました。
T37A00MB
1
-----------
1911
1 レコードが選択されました。
-------------------------------------------------------------------------
【awk程序】
processOutput.awk
#!/bin/awk -f
BEGIN {
#テーブル名
tableName = "";
#件数出力行の計数
counter = 0;
#項目名Array
itemName[1] = "";
}
{
if (NR == 1) {
print "GAIN DBテーブルにはNULLを含める項目がまとめて表示:" > "Output2";
print $0, "\n\n" >> "Output2";
} else if (match($0, /:/) != 0) {
print $0 >> "Output2";
} else {
if (match($1, /T37A00/) != 0) {
#テーブル名取得
tableName = $1;
}
if (match($1, /件数/) != 0) {
#項目名取得
for (i = 1; i <= NF - 1; i ++) {
itemName[i] = $i;
}
}
if (NR == 8 * counter + 6) {
#件数値取得処理
for (i = 1; i <= NF - 1; i ++) {
if ($i != 0) {
hasValue = 1;
break;
}
}
if (hasValue == 1) {
printf "%s\n\n", tableName >> "Output2";
for (i = 1; i <= NF - 1; i ++) {
if ($i != 0) {
printf "%s ", itemName[i] >> "Output2";
}
}
firstItem = 0;
for (i = 1; i <= NF - 1; i ++) {
if ($i != 0) {
if (firstItem == 0) {
printf "\n---------- " >> "Output2";
firstItem ++;
} else {
printf "---------- " >> "Output2";
}
}
}
firstItem = 0;
for (i = 1; i <= NF - 1; i ++) {
if ($i != 0) {
if (firstItem == 0) {
printf "\n%9s ", $i >> "Output2";
firstItem ++;
} else {
printf "%9s ", $i >> "Output2";
}
}
}
print "\n\n" >> "Output2";
}
hasValue = 0;
counter ++;
}
}
}
------------------------------------------------------------------------
输出结果如下:
【Output2】
GAIN DBテーブルにはNULLを含める項目がまとめて表示:
Mon Feb 2 17:11:08 JST 2009
T37A00MF
ME0A8件数
----------
14419
T37A00MG
ME0A8件数 EE0QJ件数 KA4ZQ件数 ME0KS件数 HE0CE件数 SO0UD件数 TO1A6件数 HU1NL件数 HA0RM件数
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1888 2 1888 1888 1888 1888 1888 1888 1888
T37A00MW
KU026件数 WA03J件数 HA01E件数 KE1NR件数 KA07B件数 TA10K件数 HA045件数
---------- ---------- ---------- ---------- ---------- ---------- ----------
294 294 294 294 294 294 294
T37A00S3
KO1N6件数
----------
4252
T37A00S6
HU1MJ件数 HU1MK件数 HU1ML件数 HU1MM件数 HU1MN件数 AA01A件数 SI0D2件数 SI2UD件数
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1795 1795 1795 1795 1795 1795 1789 1789