programing

셸 스크립트에서 sqlplus를 실행하는 동안 오류 처리 관리

bestprogram 2023. 6. 26. 21:32

셸 스크립트에서 sqlplus를 실행하는 동안 오류 처리 관리

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=shell_log.txt

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $eval_user/$eval_pass@$db_name
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
DBMS_OUTPUT.put_line('Connected to db');
EOF

if [ $? != 0 ]
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $?"
exit 0;
fi

이 스크립트가 실패하도록 강제하려고 가비지 값을 입력하고 있습니다.하지만, 짜증나게도, 그것은 어떠한 오류 코드에 대한 언급도 없이 계속 앞으로 나아갑니다.여기서 또 무엇을 해야 합니까?

맥스의 말이 맞습니다.이 수정된 스크립트 사용

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=shell_log.txt

sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF

sql_return_code=$?

if [ $sql_return_code != 0 ]
then
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $sql_return_code"
exit 0;
fi

SQLPLUS 반환 코드를 캡처하기 위해 sql_return_code를 사용합니다.

DBMS_OUTPUT 문은 "SP2-0734: 알 수 없는 명령 시작..." 오류와 함께 실패합니다.로그 파일에서 오류 메시지를 찾을 수 있습니다.

오류 로깅 기능을 사용하여 SQLPLUS 11g의 sp2 오류를 트랩할 수 있습니다.자세한 내용은 http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html 을 참조하십시오.

아지의 대답은

WHENEVER SQLERROR EXIT SQL.SQLCODE;

다음을 사용합니다.

sql_return_code=$?

올바르지 않습니다(또는 대부분의 경우 올바르지 않습니다).자세한 내용은 아래를 참조하십시오.


UNIX OS의 셸 스크립트는 최대 255개의 코드를 반환할 수 있습니다. 예: "ORA-12703 이 문자 집합 변환은 지원되지 않습니다" 반환 코드는 12703이어야 하지만 UNIX 8비트 반환 코드에 맞지 않습니다.
사실 저는 방금 테스트를 했고 "ORA-00936: missing expression"으로 실패하는 잘못된 SQL을 실행했습니다.
sqlplus에서 168(!)을 반환했습니다.
그래서 실제 반송 코드 936은 256으로 포장되었고 나머지만 반송되었습니다.936%256=168.


Windows에서는 이 기능이 작동할 수 있지만(테스트되지 않음) UNIX에서는 작동하지 않습니다(위에서 설명한 대로 테스트됨).


신뢰할 수 있는 유일한 메커니즘은 결과를 로그 파일로 스풀한 다음 다음과 같은 작업을 수행하는 것입니다.

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2

따라서 스풀 로그 파일을 grep한 다음 실제 최신 ORA 코드를 잘라냅니다.

아마도 당신의 것이 가능할지도 모릅니다.whenever문은 DB에 대한 연결이 설정된 후에 실행됩니다(이후에 언급했으므로).다음 코드를 사용해 보십시오.

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF

가짜 값을 입력하는 것은 로그인과 관련된 것일 수 있습니다.다음: Shell 스크립트를 사용하여 데이터베이스 연결 확인

WHENEVER ...는 SQL 스크립트 실행 중 오류에 대한 것입니다.스크립트에 성공적으로 연결되면(이 문제는 현재 사용자의 문제인 것으로 가정함),WHENEVER ERROR당신이 잊어버렸기 때문에EXEC와 당신의 라인에.DBMS_OUTPUT.

sql 오류 또는 os 오류만 트랩할 수 있습니다.dbms_output은 sqlplus 수준 자체에서 실패하므로 매번 오류 설정이 영향을 주지 않습니다.

언급URL : https://stackoverflow.com/questions/14734131/managing-error-handling-while-running-sqlplus-from-shell-scripts

'programing' 카테고리의 다른 글

2D 배열 값 C++  (0) 2023.06.26
Firebase FCM 사용 제한  (0) 2023.06.26
Java를 사용하여 Java 객체를 MongoDB 컬렉션에 삽입  (0) 2023.06.26
워크북을 전역 변수로 선언  (0) 2023.06.26
UI이미지를 NSData로 변환  (0) 2023.06.26