Edo::World::Blog

〜Linux/Solaris関連の作業メモ〜

シェルスクリプト

[SQL] シェルから定期的にSQLを発行

#!/bin/sh
table_name='v$session'
sql_select="select username from $table_name where username is not null;"
set_format='set newpage none
            set feed off
            set line 1000
            set trims on'

(
    echo "conn / as sysdba"
    echo "${set_format}"
    echo "${sql_select}"
) | sqlplus -s /nolog

[Oracle] SQLをシェルスクリプトから実行

[シェル作成時のチェック]

  • sqlplusのコネクションは何度も行わない
  • 日付/時間の挿入
  • SQL部分のコメントは"--"とする("#"だと実行されてしまう)
  • 整形関連
    • set head off : 列ヘッダー削除
    • set newpage none: 1行目の表示間隔を除去
    • set feed off : 問い合わせ結果の改行を除去
    • set trims on:ファイルに余白の空白文字を出力しない
    • set line 1000:1行の表示文字数(折り返しまでの制限文字数)を大きめにセット

■ヒアドキュメントを利用

[基本編]

ここからコピーした...

#!/bin/sh
table_name=dual
sql_select=select sysdate from $table_name;"

exec_query ()
{
    local _result_set=''
    local _query="${1}"

    _result_set="`sqlplus -s /nolog << EndOfSQL
        conn scott/tiger
        $_query
    exit
    EndOfSQL`"
}

exec_query $sql_select

[修正版]

エラーチェックや関数化...

#!/bin/sh
table_name='dual'
user='scott'
passwd='tiger'
sql_select="select sysdate from $table_name;"

_is_success ()
{
    # 引数存在チェック
    if [ ! " ${_query}" ]; then
        echo "sqlが指定されていません。(_is_success)"
        return 1
    fi

    # ORAが含まれるかをチェック
    echo "${_query}" | grep -q 'ORA' && return 1

    # 正常
    return 0

}

exec_query ()
{
    local _result_set=''
    local _query="${1}"
    local _set_format='set newpage none
                       set feed off
                       set line 1000
                       set trims on'

    # 引数存在チェック
    if [ ! " ${_query}" ]; then
        echo "sqlが指定されていません。(exec_query)"
        exit 1
    fi

    _result_set="$(sqlplus -s /nolog << EndOfSQL
        conn ${user}/${passwd}
        ${_set_format}
        ${_query}
    exit
    EndOfSQL)"

    if [ "${_query}" ]; then
        _is_success $_query || (echo "SQL失敗:${_result_set}"; exit 1)
    fi

    # 結果を出力
    echo "${_result_set}"
}

result=$(exec_query "${sql_select}")
echo "${result}"



■echoコマンドを利用

若干、読みやすくなった?


#!/bin/sh
table_name='dual'
user='scott'
passwd='tiger'
sql_select="select sysdate from $table_name;"

_is_success ()
{
    # 引数存在チェック
    if [ ! " ${_query}" ]; then
        echo "sqlが指定されていません。(_is_success)"
        return 1
    fi

    # ORAが含まれるかをチェック
    echo "${_query}" | grep -q 'ORA' && return 1

    # 正常
    return 0

}

exec_query ()
{
    local _result_set=''
    local _query="${1}"
    local _set_format='set newpage none
                       set feed off
                       set line 1000
                       set trims on'

    # 引数存在チェック
    if [ ! " ${_query}" ]; then
        echo "sqlが指定されていません。(exec_query)"
        exit 1
    fi

    (
    echo "conn ${user}/${passwd}"
    echo "${_set_format}"
    echo "${_query}"
    ) | sqlplus -s /nolog

    # TODO:
    # 「sqlplus -s /nolog >> ファイル名 」としてファイル内にORAが含まれるか
    #  エラーチェックする。 

    #if [ "${_query}" ]; then
    #    _is_success $_query || (echo "SQL失敗:${_result_set}"; exit 1)
    #fi

    # 結果を出力
    #echo "${_result_set}"
}

exec_query "${sql_select}"
#echo "${result}"
プロフィール

edworld

記事検索
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

livedoor 天気
  • ライブドアブログ