No shell script, estou chamando um procedimento armazenado PL/SQL.
sqlplus -s <<EOF
$v_fcp_login
set head off feed off serverout on size 1000000
exec XXIRIS_TEST_K.XXIRIS_TEST('$v_1',$v_2,$v_3,'$v_4',$v_5);
exit
EOF
Mas quando há um erro no bloco PL/SQL, preciso errar no shell script, que está sendo executado como um programa host simultâneo no Oracle, mas não está fazendo isso.
Responder1
Primeiro, você precisa fazer com que o SQL*Plus apresente um erro se ocorrer um erro de SQL. Você pode fazer isso adicionando:
WHENEVER SQLERROR EXIT FAILURE
ao seu script SQL (provavelmente no topo). Você também pode fornecer códigos diferentes (pequenos números inteiros não negativos; diferente de zero = falha) no lugar da palavra FAILURE
.
Eles retornarão ao seu script de shell no formato $?
. Assim, você pode fazer com que seu script de shell reaja a ele. Ao todo, seria algo assim:
sqlplus -s <<EOF
$v_fcp_login
set head off feed off serverout on size 1000000
WHENEVER SQLERROR EXIT FAILURE
exec XXIRIS_TEST_K.XXIRIS_TEST('$v_1',$v_2,$v_3,'$v_4',$v_5);
exit
EOF
if [ 0 -ne "$?" ]; then
echo "Stored proc blew up." >&2
exit 1
fi
Claro, você pode usar diferentes códigos de saída para indicar coisas diferentes (por exemplo, se você estivesse chamando vários procedimentos armazenados, poderia sair 1 para o primeiro explodir, sair 2 para o segundo, etc.)