melhor método para chamar código repetitivo com código sql

0

Devo desenvolver alguns scripts de shell que chamam algum código repetitivo que executa comandos sql no banco de dados. Qual é o melhor método para fazer isso, com funções em um script de shell externo, com script de shell externo com esses comandos sql ou por quê?

    
por user650034 16.06.2017 / 11:45

2 respostas

0

Escreva-o como uma função e inclua-o no seu script.

Por exemplo, escreva um "util" ou "script de função". Vamos chamá-lo de util.sh e ele tem apenas funções:

#!/bin/sh

sqlCall () {
   echo "sqlCall(), \:["${1}"]"
}

repeatedFunction () {
   echo "repeated x:["${1}"] times"
   RETURNVAR='date'
}

E, em seguida, script1.sh e script2.sh podem incluir util.sh da seguinte forma:

#!/bin/sh
#
# script 1 - includes util.sh, calls only sqlCall

# Include the functions
. /path/to/util.sh

var="s1 s2 s3"
for s in $var
do
    sqlCall $s
done

E isso é script2.sh

#!/bin/sh
#
# script 2 - includes util.sh, calls only repeatedFunction

# Include the functions
. /path/to/util.sh

i=0
while [ $i -lt 4 ]
do
    repeatedFunction $i
    i=$(($i + 1))
done
echo "Date: ${RETURNVAR}"

E o resultado disso seria:

sh ./script1.sh

sqlCall(), $1:[s1]
sqlCall(), $1:[s2]
sqlCall(), $1:[s3]

sh ./script2.sh
repeated x:[0] times
repeated x:[1] times
repeated x:[2] times
repeated x:[3] times
Date: Fri Jun 16 21:15:24 AEST 2017
    
por 16.06.2017 / 12:32
0

Se os comandos SQL não dependerem dos resultados dos comandos SQL anteriores, basta encaminhá-los para o cliente SQL ou armazená-los em um arquivo de texto e alimentá-los para o cliente SQL:

while [ some condition ]; do
    # something that sets val1, val2 and val3 in this example
    # output INSERT statement (for example):
    printf 'INSERT INTO t (c1, c2, c3) VALUES (%s, %s, %s);\n' "$val1" "$val2" "$val3"
done | mysql -h server database

A coisa que você deve evitar é fazer um loop pela chamada para um cliente SQL, como

while ...; do
    echo "statement" | mysql -h server database
done

Isso executaria a conexão e a autenticação de cada instrução e seria excepcionalmente lenta.

    
por 16.06.2017 / 13:29