我使用“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编译错误代码?
答案 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