- - PR -
シェルからDBのカウント値を取得したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-26 21:12
こんにちは。ひろぽんです。
シェルでSQL*Plusにアクセスし、カウント値を検索して件数を取得したいのですが、なぜか実際の件数と異なる値が取れてしまいます。 この前にも10件程度の検索では、同じようにやってうまく取得できたのですが、今回は件数が4000件程度になります。 …そのせいでしょうか。 何が間違っているか、ご教授お願いします。 ---------------------------------- sqlplus -S user/pass <<EOF SET LINES 200 spool aaa col param1 NEW_V O_RET set heading off; SELECT count(*) as param1 FROM TABLE ; SELECT col_str1, col_str2, col_num1, col_num2, col_num3 FROM TABLE ; set heading on; EXIT O_RET EOF COUNT=$? echo "件数:" $COUNT ---------------------------------- 【結果】 ---------------------------------- PARAM1 ---------- 3975 2006 11111 0 0 2 2006 11121 0 0 0 ・・・ 2007 19998 0 0 0 2007 19999 0 0 0 件数:135 ---------------------------------- 使用しているのは oracle8i です。 [ メッセージ編集済み 編集者: ひろぽん 編集日時 2006-12-26 21:13 ] | ||||||||
|
投稿日時: 2006-12-27 14:57
シェルスクリプト中の特殊変数 $? は直前のコマンドの終了ステータスを表すものです。(0 が正常終了など)
件数が少ない場合で取得できていたように見えたのはたまたまで、$? の正しい使い方ではありません。 255 件以下の検索であれば $? が件数を表すことがありますが、終了ステータスは下位 8 ビット以外のビットはマスクされて 0 になってしまうので、3975 ≡ 135 (mod 256) で 135 が返ってきたと考えられます。 で、まっとうな取得方法はと言うと頭を捻ってしまいましたが、こんな方法ではどうでしょう。(非常にアドホックな方法であることをお断りしておきます。)
クエリ部分を別ファイル(例では query.sql)としておく方法もあります。
よりスマートな方法が回答されることを期待します(_ _) | ||||||||
|
投稿日時: 2006-12-27 22:11
Gioさん、回答ありがとうございます!!
結局、シェル内でカウント値を持ち歩くのではなく、再度DBアクセスしてカウント値を出力しました。 (こんな簡単なことでいいとは気づかず…躍起になってました) でも、Gioさんの回答で、なぜ値が異なるのか理解できました!! ありがとうございます。 件数取得は正しい使い方ではないのですね…反省 一応、修正方法を載せます。 ---------------------------- sqlplus -S user/pass <<EOF SELECT count(*) as param1 FROM TABLE ; quit EOF …略・他処理… sqlplus -S user/pass <<EOF set heading off; SELECT '件数:'||count(*)||' 件' as param1 FROM TABLE ; quit EOF ---------------------------------- 【結果】 ---------------------------------- PARAM1 ---------- 3975 … 件数:3975 件 ---------------------------------- |
1