首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Shell 腳本操作 DB2 數據:抽取、處理與更新完整指南

     編輯:DB2 教學

前言

在實際運維開發中,經常需要編寫 Shell 腳本直接操作 DB2 數據庫,完成數據抽取、轉換、更新等任務。本文將通過具體代碼示例,詳細講解如何在 Shell 中執行 SQL 查詢、判斷返回碼、解析結果集,以及執行 UPDATE 操作並獲取 SQLCODE、SQLSTATE 等關鍵執行狀態信息。

一、數據抽取與處理流程

1. 定義並執行 SQL 查詢

首先定義查詢語句,然後通過反引號或 $() 捕獲 db2 命令的輸出:

SQL="SELECT AAA, BBB, CCC FROM MYTBL1"
SDATA=`db2 "$SQL"`

2. 返回值判斷與錯誤處理

緊接著檢查 $? 變量,非零即表示執行失敗,需輸出錯誤信息並退出:

if [ $? -ne 0 ]; then
    echo "$SDATA"
    exit 1
fi

3. 解析結果集並逐行處理

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 再刪除結尾空行。

4. 統計查詢記錄數

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."

二、數據更新與執行狀態獲取

1. 執行 UPDATE 語句

加上 -a 參數可讓 db2 輸出完整的 SQLCA 結構,便於後續解析:

SQL="UPDATE MYTBL1 SET AAA='2005',BBB='05',CCC='12'"
SDATA=`db2 -a "$SQL"`

2. 提取 SQLCODE 與 SQLSTATE

從 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."

3. 獲取更新行數與 SQLERRD(5)

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 配置文件或 db2 connect 隱式連接,避免明文洩露。

四、完整腳本範例

將上述片段組合,即可得到一個具備查詢、統計、更新、狀態檢查完整功能的 Shell 腳本,滿足日常運維自動化需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved