2009-02-04 85 views
0

我試圖運行KornShell以下命令(KSH)時,會出現斷開連接我的DB2會話:awk中管道

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'` 

什麼,我試圖做到的,是地方的指標在特定表列表放入一個我可以稍後迭代的數組中。

問題是,當我運行上述命令時,數組的內容以「SQL1024N」(它告訴我數據庫連接不存在)的錯誤消息開始。

但是,如果我刪除awk在聲明的結尾像這樣:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"` 

它工作得很好(當然,在某種程度上它返回的數據顯然沒有awk我不會捕捉。正確的數據)。

有誰知道爲什麼awk有這種影響?

我明白有多種方法可以獲取這些數據,但它讓我很困惑,爲什麼會發生這種情況。

在此先感謝。

回答

1

在這種情況下,當DB2 CLP說它沒有連接到數據庫時,這是因爲shell打開了一個子進程,它需要自己的專用db2bp後端進程,它無法訪問原始打開的連接shell進程。並不是說某些東西正在斷開連接,而是創建了一個新創建的shell進程(及其附帶的db2bp進程),但沒有被告知連接到數據庫。 解決此問題的一種方法是在知道您處於其中一種情況時,顯式連接(或重新連接)到數據庫。

set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}` 

我意識到這個問題,更多的是腳本編寫以及與DB2的awk比對系統目錄,否則我會推薦一些簡單的目錄查詢產生相同的結果。

1

我懷疑它本身就是awk。也許db2是關於標準輸出連接到tty或控制檯的?或者至少不喜歡它連接到管道時。

+0

作爲一個測試,當你在命令行中運行「db2 ... | awk ...」作爲普通命令時會發生什麼?此外,習慣使用$(...)而不是反引號;管理報價要容易得多。由於反引號捕獲輸出(通過文件或管道),因此不清楚管道是否有awk問題。 – 2009-02-05 06:28:38

+0

嗨喬納森 對不起,延遲響應。我剛剛發現了這條評論。 當「db2 | awk」命令在反引號之外運行時,它按預期工作。 – greggannicott 2009-06-22 15:19:57

0

這是一個不尋常的,因爲佩斯說它可能是一個db2怪癖。

我看到類似的問題,例如,在db2命令字符串之前使用time或timex,其中db2沒有要連接的已定義數據庫。

有一個環境變量DB2DBDFT爲隱式連接設置了默認數據庫。我很抱歉地說,我不確定此變量是否適用於非DBA用戶(假設您是應用程序開發人員)。這是值得研究,如果通過設置這個變量:

的db2set DB2DBDFT = $ {} your_db_name

並重試查詢。

如果您的環境可以連接到多個數據庫,則可以在完成工作後取消設置DB2DBDFT變量。

+0

感謝您對此的回答。我會和我們的數據庫管理員交談,並提到你的建議。當我第一次向我們的DBA展示這些時,他們只是聳聳肩膀。 考慮到這一點,再次感謝您花時間回答。 – greggannicott 2009-02-11 09:54:55

0

嘗試DB2命令與-x開關:

db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" ....

我有這個地方已經治好了我的無能管道輸出到awk的實例。

+0

公平的一點。不幸的是,我開始使用-x開關。出於某種原因,我沒有在上面的示例中包含它。謝謝你嘗試! – greggannicott 2009-02-12 12:49:43