在 shell 脚本中,我正在调用一个 PLSQL 存储过程
sqlplus -s <
但是当 plsql 块中出现错误时,我需要将在 oracle 中作为主机并发程序运行的 shell 脚本出错,但它没有这样做。
我是 shell 脚本的新手,非常感谢任何帮助。
WHENEVER SQLERROR EXIT N
在你的 SQL 脚本中使用怎么样?这会将 N 返回到您的 shell 脚本。
文档在这里。
不幸的是,没有简单易行的方法来做到这一点。无论底层 PL/SQL 命令的状态如何,SQLPLUS 大多返回成功 (0)。即使使用 'WHENEVER SQLERROR EXIT' 也不会将该错误数字状态传递回调用 shell。
SQLPLUS 返回 0 因为它能够成功执行命令。
但是,我找到了解决此问题的方法,但是您需要从 sql 会话中创建一个日志文件,然后 grep 出错误。
sqlplus -s /nolog <<EOD >> ${sql_local_output_file}
....
PROCEDURE error( p_msg VARCHAR2 ) IS
BEGIN
DECLARE
error_date VARCHAR2(20);
BEGIN
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') INTO error_date FROM DUAL;
dbms_output.put_line( '[' || error_date || ']: ERROR ' || p_msg );
END;
END error;
....
EOD
if (grep -q -e "ERROR" ${sql_local_output_file}); then
logInfo "Error found in sql script, ( ${sh_script} )."
fi