在實際運維開發中,經常需要編寫 Shell 腳本直接操作 DB2 數據庫,完成數據抽取、轉換、更新等任務。本文將通過具體代碼示例,詳細講解如何在 Shell 中執行 SQL 查詢、判斷返回碼、解析結果集,以及執行 UPDATE 操作並獲取 SQLCODE、SQLSTATE 等關鍵執行狀態信息。
首先定義查詢語句,然後通過反引號或 $() 捕獲 db2 命令的輸出:
SQL="SELECT AAA, BBB, CCC FROM MYTBL1"
SDATA=`db2 "$SQL"`
緊接著檢查 $? 變量,非零即表示執行失敗,需輸出錯誤信息並退出:
if [ $? -ne 0 ]; then
echo "$SDATA"
exit 1
fi
DB2 交互式輸出包含表頭與分隔行,實際數據從第 4 行開始,以空行結束。以下 sed 命令可過濾出純數據行:
echo "$SDATA" | sed -e '4,/^$/!d;/^$/d' | \
while read AAA BBB CCC; do
echo "AAA IS $AAA, BBB IS $BBB, CCC IS $CCC"
done
說明:4,/^$/!d 刪除第 4 行至首個空行之外的所有行;/^$/d 再刪除結尾空行。
DB2 輸出末尾會顯示類似 Number of rows retrieved is 10 的統計行,可用正則提取數字:
echo "$SDATA" | sed -n -e '/^$/{1,3d;n;s/[^0-9]*\([0-9]*\)[^0-9]*/\1/;p;}' | read CNT
echo "The count of selected data is $CNT."
加上 -a 參數可讓 db2 輸出完整的 SQLCA 結構,便於後續解析:
SQL="UPDATE MYTBL1 SET AAA='2005',BBB='05',CCC='12'"
SDATA=`db2 -a "$SQL"`
從 SQLCA 文本中使用 sed 正則捕獲關鍵字段:
echo "$SDATA" | sed -n -e 's/^.*sqlcode: \([-,0-9][0-9]*\).*/\1/p' | read SQLCODE
echo "Sqlcode is $SQLCODE."
echo "$SDATA" | sed -n -e 's/^.*sqlstate: \([-,0-9][0-9]*\).*/\1/p' | read SQLSTATE
echo "Sqlstate is $SQLSTATE."
sqlerrd 數組的第 3 個元素(索引 3)即為影響行數,第 5 個元素常用於診斷:
# 更新件數
echo "$SDATA" | sed -n -e '/sqlerrd/s/^.*(3) \([-,0-9][0-9]*\).*/\1/p' | read UPDCNT
echo "Updated data's count is $UPDCNT."
# sqlerrd(5)
echo "$SDATA" | sed -n -e '/sqlerrd/{n;s/^.*(5) \([-,0-9][0-9]*\).*/\1/;p;}' | read SQLERRD5
echo "Sqlerrd(5) is $SQLERRD5."
db2 -x 抑制表頭,或使用 db2 "EXPORT TO ... OF DEL ... 導出文件再處理,避免文本解析脆弱。SQLCODE 為 0 才視為成功,SQLSTATE 以 '00' 開頭表示無錯誤。db2 connect 隱式連接,避免明文洩露。將上述片段組合,即可得到一個具備查詢、統計、更新、狀態檢查完整功能的 Shell 腳本,滿足日常運維自動化需求。