Oracle 如果plsql程序失败,则输出shell脚本时出错

Oracle 如果plsql程序失败,则输出shell脚本时出错,oracle,shell,unix,ksh,Oracle,Shell,Unix,Ksh,在shell脚本中,我调用一个PLSQL存储过程 sqlplus-s< 但是当plsql块中出现错误时,我需要将shell脚本出错,该脚本在oracle中作为主机并发程序运行,但它没有这样做 我不熟悉shell脚本,非常感谢您的帮助。在SQL脚本中退出SQLERROR N时使用怎么样?这会将N返回到shell脚本 文档。不幸的是,没有简单易行的方法可以做到这一点。不管底层PL/SQL命令的状态如何,SQLPLUS通常返回success(0)。即使使用'Anywhere SQLERROR EXIT

在shell脚本中,我调用一个PLSQL存储过程

sqlplus-s< 但是当plsql块中出现错误时,我需要将shell脚本出错,该脚本在oracle中作为主机并发程序运行,但它没有这样做


我不熟悉shell脚本,非常感谢您的帮助。

在SQL脚本中退出SQLERROR N时使用
怎么样?这会将N返回到shell脚本


文档。

不幸的是,没有简单易行的方法可以做到这一点。不管底层PL/SQL命令的状态如何,SQLPLUS通常返回success(0)。即使使用'Anywhere SQLERROR EXIT',也不会将错误数字状态传递回调用shell

SQLPLUS返回0,因为它能够成功执行该命令

然而,我已经找到了解决这个问题的方法,但是您需要从sql会话创建一个日志文件,然后将错误清除

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
sqlplus-s/nolog${sql\u local\u output\u file}
....
程序错误(p_msg VARCHAR2)为
开始
声明
错误日期VARCHAR2(20);
开始
选择将字符(SYSDATE,'yyyyy-MM-DD HH24:MI:SS')从DUAL输入错误日期;
dbms|u output.put|u行(“['| | error|u date | |]:error'| | p| msg);
结束;
端部误差;
....
排爆药
if(grep-q-e“ERROR”${sql\u local\u output\u file});然后
logInfo“在sql脚本中发现错误,(${sh_script})”
fi

感谢您的回复。。我真的很感谢你抽出时间。。。我已经使用了它,即使plsql代码中有错误,我的shell脚本仍然成功完成。