1.情况描述
数据库mytestdb里有3个存储过程,存储过程有一个输入日期参数,例如2023-09-11
想要通过shell脚本调用mysql的存储过程
mysql客户端远程连接mysql服务器
2.废话不多说,直接上脚本
脚本有一个输入参数日期,先检查日期是否合法;在写入想要执行的存储过程循环执行,存储过程报错就会停止。
#!/bin/bash
#报错立刻停止
set -e
# MySQL连接信息
MYSQL_USER="testmy" #
MYSQL_PASSWORD="testmy123"
MYSQL_HOST="192.168.80.80"
MYSQL_DATABASE="testmydb"
MYSQL_PORT="3306"
#检查传入的日期参数 指定为8位日期
if ! [[ $1 =~ ^[0-9]{8}$ ]]; then
echo '输入参数格式不正确,输入格式示例: 20230101'
exit 1
fi
if ! date -d "$1" >/dev/null 2>&1
then
echo '不合法日期,请输入正确日期'
exit 1
fi
#传入参数
IN_DATE=$1
IN_FORMAT_DATE=$(date -d "$IN_DATE" +%Y-%m-%d)
#执行存储过程
function execute_proc() {
echo "Executing stored procedure $1"
if ! mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $MYSQL_HOST -D $MYSQL_DATABASE -P $MYSQL_PORT -e "CALL $1('$2');"; then
echo " Error:Failed to execute stored procedure"
exit 1
fi
}
#存储过程名
proc_prefix=(
"proc_test1"
"proc_test2"
"proc_test3"
)
for PROC_START in "${proc_prefix[@]}"
do
execute_proc $PROC_START $IN_FORMAT_DATE
done
3.演示截图
可以重定向输出日志
这里有warning警告提示
mysql: [Warning] Using a password on the command line interface can be insecure.
是脚本里mysql命令行里有密码导致的,可以修改shell脚本,使用 mysql_config_editor安全配置生成一个.mylogin.cnf的文件,通过判断这个文件对应的路径存不存在来指定,这样的话就不会弹出这个警告了。或者通过定义环境变量mysql_pwd来实现消除这个警告。建议是用前者,下一篇文章中有这段代码。
也可以通过crontab命令自行配置定时任务哦,当然一般批量执行存储过程还是etl调度工具好用。