シェルスクリプトで SQL の結果を1行づつ処理する
シェルスクリプトで Oracle SQL*Plus の SQL 実行結果を1行づつ処理する場合どのようにシェルスクリプトを組めばよいのか説明していきます。1行づつ処理したい SQL とその実行結果を確認
まず最初に1行づつ処理したい SQL とその実行結果を確認しましょう。ここでは ALL_TABLES というテーブルから得られる Oracle のシステムテーブル一覧を1行づつシェルスクリプトで処理する場合で説明します。
以下は今回1行づつ処理したい SQL とその実行結果です。
SQL> SELECT TABLESPACE_NAME, TABLE_NAME, NUM_ROWS FROM all_tables WHERE TABLESPACE_NAME = 'SYSTEM' AND rownum <= 5; TABLESPACE_NAME TABLE_NAME NUM_ROWS ----------------- ------------------ ---------- SYSTEM ICOL$ 4221 SYSTEM CON$ 5944 SYSTEM UNDO$ 70 SYSTEM PROXY_ROLE_DATA$ 0 SYSTEM FILE$ 26
シェルスクリプトの作成
ここでは test.sh というシェルスクリプトを以下の内容で作成します。#!/bin/bash sqlplus -s username/password <<EOS | sed -e 's/[\t ]//g' | while IFS=',' read tablespace_name table_name num_rows ; do SET FEED OFF SET HEAD OFF SET LINES 1000 SET PAGES 0 SET VERIFY OFF SELECT TABLESPACE_NAME || ',' || TABLE_NAME || ',' || NUM_ROWS FROM all_tables WHERE TABLESPACE_NAME = 'SYSTEM' AND rownum <= 5; QUIT EOS cat <<EOD =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : ${tablespace_name} table_name : ${table_name} num_rows : ${num_rows} EOD done
SQL 実行結果をパイプ(|)でシェルのループ処理に渡してあげて、その結果をシェルスクリプト内で1行ずつ処理するというものになります。
シェルスクリプを実行
では早速作成した test.sh スクリプトを実行してみましょう。結果は次のようになります。$ chmod 744 ./test.sh $ ./test.sh =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : SYSTEM table_name : ICOL$ num_rows : 4221 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : SYSTEM table_name : CON$ num_rows : 5944 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : SYSTEM table_name : UNDO$ num_rows : 70 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : SYSTEM table_name : PROXY_ROLE_DATA$ num_rows : 0 =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] tablespace_name : SYSTEM table_name : FILE$ num_rows : 26
このスクリプトを改変することでいろんなフォーマットでデータを1行づつ表示したり加工したりすることが出来るようになります。
cron 経由でのレポートも簡単に作成できますね。