シェルスクリプトで Oracle SQL*Plus の SQL 実行結果を1行づつ処理する



シェルスクリプトで 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 経由でのレポートも簡単に作成できますね。