배치 쉘에서 SQL을 실행하여 종료 코드를 반환합니다.
7057 단어 ShellScriptLinux 명령오라클
실현하고 싶은 일
JP1이나 태스크 스케줄러 등에서 배치 처리를 실시한다.
배치의 내용은 SQL 실행.
SQL의 처리 결과에 의해 종료 코드(에러 코드)를 돌려주고, 기동원에서 에러 판정을 실시할 수 있도록 하고 싶다.
파일 구성
sh フォルダ
├ db_env.sh ←DBの接続情報等を保持する
├ exec_sql.sh ←SQLを実行するシェル
└ sql フォルダ
├ hoge.sql
├ 他にも色々SQLファイルを置くことができる
코드
DB 연결 정보 파일
설정 정보는 각자의 정보로 변경해 주십시오.
db_env.shexport 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이라든지 태스크 스케줄러로부터 실행해 쓰고 있었습니다만, 수중에 해당 툴을 준비할 수 없기 때문에, 커멘드상에서 쉘을 직접 실행하고 있습니다.
실행 결과 확인
참고로 한 사이트
sh フォルダ
├ db_env.sh ←DBの接続情報等を保持する
├ exec_sql.sh ←SQLを実行するシェル
└ sql フォルダ
├ hoge.sql
├ 他にも色々SQLファイルを置くことができる
코드
DB 연결 정보 파일
설정 정보는 각자의 정보로 변경해 주십시오.
db_env.shexport 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이라든지 태스크 스케줄러로부터 실행해 쓰고 있었습니다만, 수중에 해당 툴을 준비할 수 없기 때문에, 커멘드상에서 쉘을 직접 실행하고 있습니다.
실행 결과 확인
참고로 한 사이트
export db_user=DBユーザー
export db_pass=パスワード
export db_host=192.168.XXX.XXX:1521
export db_service=orcl
#!/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エラーが発生した場合はエラーコードを返す
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이라든지 태스크 스케줄러로부터 실행해 쓰고 있었습니다만, 수중에 해당 툴을 준비할 수 없기 때문에, 커멘드상에서 쉘을 직접 실행하고 있습니다.
실행 결과 확인
참고로 한 사이트
Reference
이 문제에 관하여(배치 쉘에서 SQL을 실행하여 종료 코드를 반환합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kariyaitaru/items/e3c064786a90d2964069텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)