Script shell: redireciona a saída da consulta SQL para um arquivo

0

Dentro de um script de shell, escrevi abaixo

sqlq(){
result='sqlplus -S sss/eee@sid < $1|grep -v '^$''
echo $result
}

echo "select * from emp" > q.sql
sqlq q.sql

Eu preciso direcionar a saída para um arquivo. Eu tentei spool dentro q.sql como abaixo, mas não funcionou

echo "SPOOL /tmp/test.txt; select * from emp';SPOOL off" > q.sql
    
por Srikanth Yadake 03.08.2016 / 09:27

2 respostas

2

Seu código:

sqlq(){
result='sqlplus -S sss/eee@sid < $1|grep -v '^$''
echo $result
}

echo "select * from emp" > q.sql
sqlq q.sql

O echo e a variável na função sqlq não são necessários:

sqlq () {
  sqlplus -S "sss/eee@sid" < "$1" | grep -v '^$'
}

Isso enviará a saída da função para a saída padrão (como antes).

Ao chamar a função, você pode redirecionar sua saída para um arquivo:

cat >query.sql <<END_SQL
SELECT * FROM emp;
END_SQL

sqlq query.sql >result.out

O motivo pelo qual estou usando um aqui-documento aqui é que facilita muito a criação de consultas SQL com várias linhas:

cat >query.sql <<END_SQL
SELECT data.*
FROM data
  JOIN attributes ON (data.attr_id = attributes.attr_id)
WHERE attributes.name = "Example";
END_SQL

... por exemplo.

    
por 03.08.2016 / 09:39
1
  1. a saída de uma função pode ser redirecionada para um arquivo, igual a qualquer outro comando. por exemplo
echo "select * from emp" > q.sql
sqlq q.sql > emp.txt
  1. Eu reescreveria essa função para que não precisasse de um arquivo temporário. Eu também estaria inclinado a deixar de fora o grep -v (ou torná-lo opcional). por exemplo
sqlq() {
  local filter
  filter='cat'

  # very primitive, use getopts for real option handling.
  if [ "$1" == "--delete-blank-lines" ] ; then
    filter='grep -v "^$"'
    shift
  fi

  # each arg is piped into sqlplus as a separate command
  printf "%s\n" "$@" | sqlplus -S sss/eee@sid | $filter
}

sqlq --delete-blank-lines 'select * from emp' > emp.txt

# two sql commands:
sqlq 'select * from emp;' 'select * from foo' > empfoo.txt

# that last example works just as well as:
sqlq 'select * from emp; select * from foo' > empfoo.txt
  1. Muitas melhorias são possíveis - por exemplo, outras opções úteis na função incluem:

    • lendo os comandos sql do stdin em vez de usar printf se detectar que está sendo canalizado para
    • uma opção para ler o sql de um arquivo
    • abilidade para passar opções arbitrárias ao comando sqlplus .
por 04.08.2016 / 05:59