用sql代码调用重复代码的最佳方法

用sql代码调用重复代码的最佳方法

我必须开发一些 shell 脚本来调用一些重复代码,这些代码对数据库执行 sql 命令。使用外部 shell 脚本中的函数、使用这些 sql 命令的外部 shell 脚本来制作这些内容的最佳方法是什么?或者为什么?

答案1

只需将其编写为函数并将其包含在脚本中即可。

例如,编写“util”或“函数脚本”。让我们调用它util.sh,它里面只有函数:

#!/bin/sh

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

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

然后script1.shand可以像这样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

这将为每个语句执行连接和身份验证,并且将异常地慢的。

相关内容