2011-11-10 7 views
0

"WHEREEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;"을 사용합니다. 내 plsql 스크립트에서 쉘 스크립트에서 그들을 사용합니다. 이 잘 작동 :sqlplus에서 plsql 컴파일 오류가 발생했을 때 오류 코드를 반환하는 방법

echo exit | sqlplus user/[email protected] @bad.sql && echo "boo" 

"는 소리"가 인쇄되지 않습니다 :

echo exit | sqlplus user/[email protected] @normal.sql && echo "boo" 

이 잘 너무 작동 "우우"스크립트 및 인쇄를 실행합니다.

그러나 나쁜 경우입니다 :

분명히 잘못
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK; 

create or replace 
PACKAGE TESTING 
IS 
function boo (co_id number) return varchar2; 
END; 
/

create or replace 
PACKAGE BODY TESTING 
is 
end; 

- 오류 코드가 반환되지 않으며 "우우"는 인쇄됩니다. sqlplus 스크립트에서 plsqsl 컴파일 오류 코드를 반환하려면 어떻게해야합니까?

답변

2

결과를 구문 분석해야합니다. 유닉스 에러 코드는 0에서 255까지의 범위에 있으며, 거기에는 모든 종류의 마스크와 신호가 숨겨져 있습니다. 따라서 유닉스 오류 코드에는 오라클 오류 번호를 기록 할 수 없습니다.

기본적으로 SQL 스크립트에 show errors 문을 포함시켜야합니다. 그러나 오류가 인쇄되기 전에 오류가 발생하므로 거기에 WHENEVER 문을 사용하지 마십시오. 예 : bad.sql이 될 것입니다

create or replace 
PACKAGE TESTING 
IS 
function boo (co_id number) return varchar2; 
END; 
/
show errors 

create or replace 
PACKAGE BODY TESTING 
is 
end; 
/
show errors 

그런 다음 쉘 스크립트 뭔가 같이해야한다 :

ERR_OUT="$(sqlplus rdbds/[email protected] < bad.sql | egrep '^(ORA|PLS)-')" 
if [ -n "$ERR_OUT" ] 
then 
    echo "Errors in SQL:" 
    echo "$ERR_OUT" 
else 
    echo boo 
fi 
+0

감사합니다, 그게 내가 생각하고 있었는지,하지만 난 더 나은 방법이입니다 희망했다. –

+0

"show errors"의 출력을 구문 분석하는 대신 여기에서 제안 된 것처럼 SQL에서 user_errors 또는 all_errors 테이블의 내용을 구문 분석하는 것이 좋습니다. https://forums.oracle.com/forums/thread.jspa?threadID=692710 (거기에 제안 된 또 다른 세 번째 해결책이있다) –

관련 문제