배치 쉘에서 SQL을 실행하여 종료 코드를 반환합니다.

실현하고 싶은 일



JP1이나 태스크 스케줄러 등에서 배치 처리를 실시한다.
배치의 내용은 SQL 실행.
SQL의 처리 결과에 의해 종료 코드(에러 코드)를 돌려주고, 기동원에서 에러 판정을 실시할 수 있도록 하고 싶다.

파일 구성


sh フォルダ
├ db_env.sh  ←DBの接続情報等を保持する
├ exec_sql.sh ←SQLを実行するシェル
└ sql フォルダ
  ├ hoge.sql
  ├ 他にも色々SQLファイルを置くことができる

코드



DB 연결 정보 파일



설정 정보는 각자의 정보로 변경해 주십시오.

db_env.sh
export db_user=DBユーザー
export db_pass=パスワード
export db_host=192.168.XXX.XXX:1521
export db_service=orcl

SQL 실행 배치



배치 인수에 실행하고 싶은 SQL의 파일명 (예를 들면 hoge.sql )을 주는 것으로, 해당 SQL을 실행할 수 있습니다.
SQL의 실행에 있어서는 인수는 지정하지 않는 상정.

exec_sql.sh
#!/bin/sh
# このファイルが置かれているディレクトリを変数に取得
SCRIPT_DIR=$(cd $(dirname $0); pwd)
SQL_FILE=$1

# set Oracle environment
. $SCRIPT_DIR/db_env.sh

if [ "$SQL_FILE" = "" ]; then
    # NO arguments
    exit 1
else
    if [[ -f $SCRIPT_DIR/sql/$SQL_FILE ]]; then
        sqlplus $db_user/$db_pass@$db_host/$db_service @$SCRIPT_DIR/sql/$SQL_FILE;
    else
        # NOT exists such file
        exit 2
    fi
fi
# return SQL Result
exit $?

SQL 스크립트 파일



이것이 곡자였습니다.
연속하는 SQL의 처리를 실시하고 싶고, 예외나 논리 에러(예를 들면 처리 건수가 0건이면 에러로 하고 싶다 등)는 캐치하고 싶고, 그 처리 결과를 종료 코드로서 돌려주고 싶었지만, 사정이 있어서 저장 정의는 할 수 없기 때문에 익명 블록을 이용하기로 하면 RETURN 를 사용할 수 없거나, 익명 블록 밖에서 EXIT 하고 싶지만 블록 내의 변수는 외부에서 사용할 수 없고...

hoge.sql
-- SQLエラーが発生した場合はエラーコードを返す
WHENEVER SQLERROR EXIT sql.sqlcode;
-- 独自エラーコードを変数定義
VARIABLE V_ERROR_CD number;

DECLARE
    -- 影響件数を格納する変数
    RESULT_COUNT NUMBER;
    -- ユーザー定義例外の宣言
    USER_EXCEPTION EXCEPTION;
BEGIN
    -- oracle12c以降なら、変数宣言時に初期値をセットできます。
    -- 今回の環境が11gだったのでここで初期化しています。
    :V_ERROR_CD := 0;

    -- SQL処理(サンプル)
    DELETE FROM hoge_table
    ;
    -- 上記処理の影響件数を取得
    RESULT_COUNT := SQL%ROWCOUNT;

    -- 条件によりエラーコードを指定し、ユーザー定義例外へ
    IF RESULT_COUNT <> 0 THEN
        :V_ERROR_CD := 1;
        RAISE USER_EXCEPTION;
    END IF;

    -- 他にもこの辺にSQL処理を書けます。
EXCEPTION
    WHEN USER_EXCEPTION THEN
        -- ユーザー定義例外発生時の処理
        ROLLBACK;
    WHEN OTHERS THEN
        -- SQL例外発生時の処理
        ROLLBACK;
END;
/
-- 呼び出し元にエラーコードを返す
EXIT :V_ERROR_CD;

실행 방법



JP1이라든지 태스크 스케줄러로부터 실행해 쓰고 있었습니다만, 수중에 해당 툴을 준비할 수 없기 때문에, 커멘드상에서 쉘을 직접 실행하고 있습니다.



실행 결과 확인





참고로 한 사이트


  • sqlplus의 sqlcode를 sh의 종료 코드로 반환
  • SQLPLUS에서 반환 값을 일괄 스크립트로 받는 프로세스
  • 잊어 버린 엔지니어의 오라클 SQL 참조 (독점 예외 처리)
  • Oracle11g 참조 - RETURN 문
  • 좋은 웹페이지 즐겨찾기