2011-11-10 66 views
0

我使用「WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;」在我的plsql腳本中在shell腳本中使用它們。這工作得很好:如何從sqlplus中返回錯誤代碼以防出現plsql編譯錯誤

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

執行 「噓」 腳本並打印這工作太細:

echo exit | sqlplus user/[email protected] @bad.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

您將需要從輸出中解析它們。 Unix錯誤代碼的範圍是0到255,其中隱藏了各種掩碼和信號。所以你不能在unix錯誤代碼中記錄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 

那麼你的shell腳本應該是這樣的:

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

而不是解析「顯示錯誤」的輸出,最好在sql中解析user_errors或all_errors表的內容,如下所示:https://forums.oracle.com/forums/thread.jspa?threadID=692710(那裏還有另一個 - 第三個解決方案) –