如果从sqlplus plsql编译错误,如何返回错误代码

时间:2011-11-10 12:13:53

标签: oracle scripting plsql sqlplus

我使用“WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;”在我的plsql脚本中使用它们在shell脚本中。这很好用:

echo exit | sqlplus user/pass@XE  @normal.sql && echo "boo"

执行脚本并打印“boo” 这也很好:

echo exit | sqlplus user/pass@XE  @bad.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编译错误代码?

1 个答案:

答案 0 :(得分: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/rdbds@XE  < bad.sql | egrep '^(ORA|PLS)-' )"
if [ -n "$ERR_OUT" ]
then
    echo "Errors in SQL:"
    echo "$ERR_OUT"
else
    echo boo
fi