データベースに対してSQLコマンドを実行するいくつかの繰り返しコードを呼び出すには、いくつかのシェルスクリプトを開発する必要があります。これらのSQLコマンドを使用する外部シェルスクリプトである外部シェルスクリプトでこれらの機能を使用する最善の方法は何ですか?それともなぜですか?
答え1
関数として作成してスクリプトに含めるだけです。
たとえば、「util」または「function script」を作成します。と呼びましょうutil.sh
。機能だけがある:
#!/bin/sh
sqlCall () {
echo "sqlCall(), \$1:["${1}"]"
}
repeatedFunction () {
echo "repeated x:["${1}"] times"
RETURNVAR=`date`
}
その後、次script1.sh
のように含めることができますscript2.sh
。util.sh
#!/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
これは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}"
結果は次のとおりです。
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
答え2
SQLコマンドが以前のSQLコマンドの結果に依存しない場合は、SQLクライアントにパイプするか、テキストファイルに保存して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
あなたは何をすべきですか避けるたとえば、SQLクライアントへの循環呼び出しです。
while ...; do
echo "statement" | mysql -h server database
done
これは、各ステートメントに対して接続と認証を実行し、異常に遅い。