在生產環境中,使用 Shell 腳本調用 DB2 命令行工具進行數據抽取、更新是常見的自動化運維手段。本文整理了實用的 Shell 處理 DB2 數據庫模板,涵蓋查詢結果解析、錯誤碼捕獲、更新影響行數統計等核心場景。
確保 DB2 命令行環境已配置(db2profile 已 source),腳本中直接調用 db2 命令即可。
#!/bin/ksh
# SQL 定義
SQL="SELECT AAA, BBB, CCC FROM MYTBL1"
# 執行查詢,捕獲輸出
SDATA=`db2 "$SQL"`
# 返回值判斷:非 0 表示執行失敗
if [ $? -ne 0 ]; then
echo "$SDATA" # 輸出 DB2 錯誤信息
exit 1
fi
# 數據處理:sed 過濾表頭與空行,while 循環逐行讀取
# DB2 輸出格式通常前 3 行為表頭,第 4 行起為數據,末尾有空行
echo "$SDATA" | sed -e '4,/^$/!d;/^$/d' | \
while read AAA BBB CCC; do
echo "AAA IS $AAA, BBB IS $BBB, CCC IS $CCC"
# 此處可加入業務邏輯:數據轉換、寫入文件、調用 API 等
done
# 統計查詢行數:提取結果集末尾的記錄條數
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."
exit 0
sed -e '4,/^$/!d;/^$/d':刪除非第 4 行到第一個空行之間的內容,再刪除空行,精準提取數據行。while read AAA BBB CCC:利用 Shell 內建 read 按空白分割欄位賦值給變數。# 更新語句
SQL="UPDATE MYTBL1 SET AAA='2005',BBB='05',CCC='12'"
# -a 參數:顯示 SQLCA 詳細信息(包含 sqlcode, sqlstate, sqlerrd 等)
SDATA=`db2 -a "$SQL"`
# 提取 SQLCODE(執行狀態碼,0 成功,負數錯誤,正數警告)
echo "$SDATA" | sed -n -e 's/^.*sqlcode: \([-,0-9][0-9]*\).*/\1/p' | read SQLCODE
echo "Sqlcode is $SQLCODE."
# 提取 SQLSTATE(標準狀態碼,如 00000 成功)
echo "$SDATA" | sed -n -e 's/^.*sqlstate: \([-,0-9][0-9]*\).*/\1/p' | read SQLSTATE
echo "Sqlstate is $SQLSTATE."
# 提取更新行數:sqlerrd(3) 表示受影響行數
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."
| 字段 | 含義 | 典型值 |
|---|---|---|
| sqlcode | DB2 專用返回碼 | 0 成功, -803 唯一鍵衝突 |
| sqlstate | ANSI 標準狀態碼 | 00000 成功, 23505 唯一違規 |
| sqlerrd(3) | INSERT/UPDATE/DELETE 影響行數 | 整數 |
| sqlerrd(5) | 診斷信息/內部使用 | 視具體情況 |
$? 和 sqlcode,失敗時記錄完整錯誤輸出便於排查。db2 +c 關閉自動提交,手動 db2 commit)。掌握這些模板,即可快速構建穩健的 DB2 自動化運維腳本,滿足數據遷移、定時清理、報表生成等多種業務場景。