removendo todas as abas no sqlplus

removendo todas as abas no sqlplus

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 sqlplus,
  • 2º passo: Formate algum 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
}

Recebi um número, 1234567, quando chamo esta função.

PSNR=$(psnr)

Escrevo uma palavra para um e-mail:

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

se eu quiser usar essa variávelMAILTMPDevo usar tr -d '\040\011'o que encontrei aqui, no stackexchange, pois o resultado sem tr será esse:

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 aba '\t' é o que não entendo: de onde vem, do sqlplus? Possivelmente especificidade do banco de dados? (Eu verifiquei no TOAD, ambas as colunas são números (18). Talvez a função em ksh tenha alguns recursos especiais?

Responder1

Também me deparei com esse espaço em branco indesejado ao trabalhar com um banco de dados diferente. Claramente, scripts de shell e ferramentas como SQLPlus são errados para extrair dados de bancos de dados, mas há ocasiões em que isso é conveniente.

Minha solução é retirar os espaços em branco iniciais e finais 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 kshnão suportar a $'...'sintaxe da string, é fácil substituí-la:

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

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

Uma solução alternativa rápida e suja é usar o shell para remover espaços em branco indesejados. Deixando sua psnr()função inalterada, em vez disso:

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

você escreveria isto:

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

Responder2

sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF

Este espaço é fornecido na guia. Minhas consultas sqlplus são geradas apenas spaceno 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

informação relacionada