風待ち

プログラミングの勉強や日々の出来事のログなど

Oracleの簡単なSQLを実行するBashのシェルスクリプトを今年になってからいろんなところで書くので自分用のテンプレート

ちょっとした確認用のSQLを実行するのにSQL Developerを立ち上げるのが重いというのもあり、よく実行するものはシェルスクリプトにしている。

今年に入ってから、いろいろな場所で同じようなSQLばかり書いているので、面倒だと感じ始めたからシェルスプリクトにする。

ただ、それぞれ別の場所で作るから毎回微妙に違うものを書いていたので、次に自分が作るとき用のメモ。

自分がよく作るのはGit for WindowsBashOracleに接続してSQLを投げるシェルスプリクト。

そのまま実行するとSELECTするSQLが実行され、-aをつけるとINSERTするSQLを実行する。

作るもののほとんどがマスターに登録があるかないかを確認する系のSQLで、EXISTSで確認して無かったら追加する流れなので、値は指定しない事が多い。

#!/bin/bash
#
# 説明

readonly ORACLE_CONNECTION=USER/PASSWORD@SERVER:PORT/SID

function usage() {

cat <<_EOF_

Usage:
  $0 [-a]

Description:
  説明

Option:
  -a ADD DATA

_EOF_

exit 1
}

err() {
  echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $@" >&2
}

function select_data() {

sqlplus -s $ORACLE_CONNECTION << EOF

SELECT *
  FROM USERS A
 WHERE NOT EXISTS (
           SELECT * FROM USERS2 B WHERE A.ID = B.ID
       )
;

EXIT;

EOF

  if [ $? -ne 0 ]; then
    err "ERROR SELECT"
    return 1
  fi

  return 0
}

function insert_data() {

sqlplus -s $ORACLE_CONNECTION << EOF

INSERT INTO USERS(
    ID
  , NAME
)
SELECT A.ID
     , A.NAME
  FROM USERS2 A
 WHERE NOT EXISTS (
           SELECT * FROM USERS B WHERE A.ID = B.ID
       )
;

COMMIT;

EXIT;

EOF

  if [ $? -ne 0 ]; then
      err "ERROR INSERT"
      return 1
  fi

  return 0
}

FLAG_A=""
if [ "$OPTIND" = 1 ]; then
  while getopts abf:h OPT
  do
    case $OPT in
      a)
        FLAG_A="on"
        ;;
      h)
        usage
        ;;
      \?)
        echo "Try to enter the h option." 1>&2
        ;;
    esac
  done
else
  echo "No installed getoptions-command." 1>&2
  exit 1
fi

function main() {

  if [ -n "$FLAG_A" ]; then
    insert_data
  else
    select_data
  fi

  return 0
}

main