- PR -

シェルからDBのカウント値を取得したい

1
投稿者投稿内容
ひろぽん
会議室デビュー日: 2006/06/05
投稿数: 6
投稿日時: 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 ]
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-12-27 14:57
シェルスクリプト中の特殊変数 $? は直前のコマンドの終了ステータスを表すものです。(0 が正常終了など)
件数が少ない場合で取得できていたように見えたのはたまたまで、$? の正しい使い方ではありません。

255 件以下の検索であれば $? が件数を表すことがありますが、終了ステータスは下位 8 ビット以外のビットはマスクされて 0 になってしまうので、3975 ≡ 135 (mod 256) で 135 が返ってきたと考えられます。

で、まっとうな取得方法はと言うと頭を捻ってしまいましたが、こんな方法ではどうでしょう。(非常にアドホックな方法であることをお断りしておきます。)

コード:
sqlplus -S user/pass <<EOF
# 以下クエリ本体は略
SELECT count(*) as param1 FROM TABLE ; # クエリの最初にこれを実行しておく
...
EOF > tmp.txt

count=`head -1 tmp.txt`



クエリ部分を別ファイル(例では query.sql)としておく方法もあります。
コード:
count=`sqlplus -S user/pass @query.sql | head -1`



よりスマートな方法が回答されることを期待します(_ _)
ひろぽん
会議室デビュー日: 2006/06/05
投稿数: 6
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)