removendo todas as abas no sqlplus

0

Eu posso resolver esse problema, mas não entendo por que isso acontece.

Minha tarefa é: (em ksh)

  • 1º passo: Consultar um número de um banco de dados com o sqlplus,
  • 2º passo: formatar texto para um e-mail,
  • 3º passo: envie um email com estes.

Esta é uma parte do meu código:

psnr() {
sqlplus -s USR/PASS@PROD << EOS
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
  select max_number-last_number from postalslip
  where state = 'OPEN'
/
exit
/
EOS
}

Eu tenho um número, 1234567, quando eu chamo essa função.

PSNR=$(psnr)

Eu escrevo uma palavra para um e-mail:

echo "Today's result is: $PSNR" > $MAILTMP

se eu quiser usar esta variável MAILTMP eu devo usar tr -d '01' o que encontrei aqui, em stackexchange, porque o resultado sem tr será este:

od -c mailtmp.17872.txt
0000000   T   o   d   a   y   '   s       r   e   s   u   l   t       i
0000020   s   :      \t                               1   2   3   4   5
0000040   6   7  \n
0000043

Essa guia '\ t' é o que eu não entendo: de onde ela vem, do sqlplus? Possivelmente especificidade de DB? (Eu verifiquei no TOAD, ambas as colunas são number (18). Talvez a função em ksh tenha algumas características especiais?

    
por Apex 04.11.2015 / 17:18

2 respostas

2

Eu também me deparei com esse espaço indesejado ao trabalhar com um banco de dados diferente. Claramente, scripts de shell e ferramentas como o SQLPlus são a coisa errada a ser usada para extrair dados de bancos de dados, mas há ocasiões em que é conveniente.

Minha solução é remover o espaço em branco inicial e final do resultado:

psnr() {
  sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
 select max_number-last_number from postalslip
 where state = 'OPEN'
/
exit
/
EOS
}

Se ksh não suportar a sintaxe $'...' string, é fácil substituir:

# Original style
sed $'s/^[ \t]*//'

# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"

Um conserto rápido e sujo alternativo é usar o shell para remover espaços em branco indesejados. Deixando sua função psnr() inalterada, em vez disso:

echo "Today's result is: $PSNR" > $MAILTMP

você escreveria isto:

echo "Today's result is:" $PSNR > $MAILTMP
    
por 04.11.2015 / 17:36
0
sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF

Isso é fornecido quando o espaço é tab. Minhas consultas do sqlplus geram apenas space e no formato csv, então eu uso isso para remover espaço indesejado

echo 'foo bar       ,baz      ,foobar   ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar
    
por 14.07.2017 / 19:28