Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

WHENEVER SQLERROR nunca funciona


Considere abaixo o trecho genérico:
$ cmd1 < <(cmd2) # Or cmd1 <(cmd2)
$ echo $?

Aqui, $? está definido para o status de saída de cmd1 . O status de saída de cmd2 está perdido.

No seu caso, sqlplus passa a ser cmd2. Portanto, o status de saída desse comando não é capturado em $? .

Você pode tentar isso;
$ sqlplus ... | cmd1
$ status=(${PIPESTATUS[@]})
$ for i in ${status[@]}; do
>     [ $i -ne 0 ] && echo Exited with $i
> done
$ echo Exited with 0

Observe que se cmd1 é uma estrutura complexa (como while read por exemplo) qualquer coisa que você executar nesse loop while será executado em um subshell e qualquer ambiente (variáveis/pwd) alterado será perdido.