Uma abordagem que você pode fazer é usar o comando SPOOL
no seu interpretador SQL.
Então, inicie o seu pipe nomeado como você já estava fazendo:
mkfifo sqlconsole
tail -f sqlconsole | /opt/sqlcl/bin/sql /nolog
Em seguida, faça seu script SQL, mas desta vez ativando serveroutput
e também fazendo spool para um arquivo especificado. Neste exemplo, vou apenas fazer isso para out.txt
.
conn hr/[email protected]/xe
SPOOL out.txt
select * from dual;
set serveroutput on
exec dbms_output.put_line('PROCESS_FINISHED');
SPOOL OFF
disconnect
Aqui, também optei por imprimir uma string para o arquivo em spool - PROCESS_FINISHED
- como uma forma de sinalizar quando o script foi concluído, já que o script SQL e o script bash serão executados lado a lado, com o script script bash provavelmente concluído antes de o script ser concluído.
Com isso, posso criar um script bash ( atomRunner.sh
) para enviá-lo ao pipe nomeado:
#!/bin/bash
> out.txt
cat connect.sql > sqlconsole
MAX_TIME=10
scriptStart=$(date -u +"%s")
secondsSince=0
while true; do
if [[ "${secondsSince}" -ge "${MAX_TIME}" ]] || grep -q "PROCESS_FINISHED" out.txt; then
break
fi
nowDate=$(date -u +"%s")
secondsSince=$((nowDate-scriptStart))
sleep 0.1
done
cat out.txt
if [[ "${secondsSince}" -ge "${MAX_TIME}" ]]; then
echo "Script took longer than expected to complete" >&2
exit 1
fi
exit 0
Em seguida, execute:
$ ./atomRunner.sh
SQL> set serveroutput on
SQL> select * from dual;
D
-
X
SQL> exec dbms_output.put_line('PROCESS_FINISHED')
PROCESS_FINISHED
SQL> SPOOL OFF