2011-11-10 10 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" 

は、これはあまりにも正常に動作するスクリプトや版画 "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; 

- エラーコードが返されず、「booが」印刷されます。 sqlplusスクリプトからplsqslコンパイルエラーコードを返すにはどうすればよいですか?

答えて

2

出力から解析する必要があります。 Unixのエラーコードは0から255までの範囲にあり、あらゆる種類のマスクとそこに隠された信号があります。したがって、OracleエラーコードにOracleエラー番号を記録することはできません。

したがって、基本的には、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(そこに示唆された別の第3の解決法もある) –

関連する問題