【需求】
在項目測試階段,需要將所有表中值為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