我想从 bash shell 脚本将一些变量传递到 mysql 文件。
这是我的 shell 脚本。
#!/bin/bash
echo $0 Started at $(date)
mysql -uroot -p123xyzblabla MyMYSQLDBName<mysqlfile.sql PARAM_TABLE_NAME
Run Code Online (Sandbox Code Playgroud)
请注意,这是 MYSQL 而不是 SQLPLUS
我的 MYSQL.sql ,我想读取并使用传递的参数/参数(PARAM_TABLE_NAME)
select count(*) from PARAM_TABLE_NAME
Run Code Online (Sandbox Code Playgroud)
问题 1:将变量(PARAM_TABLE_NAME)传递到 sql 文件(mysqlfile.sql)的正确语法是什么?问题2:如何打印sql文件(mysqlfile.sql)中的变量(PARAM_TABLE_NAME)?
基本上,我想制作通用 SQL 脚本,它可以根据收到的输入从表中加载或选择数据。
谢谢
不存在向 SQL 文件传递参数这样的事情。SQL 文件只不过是包含 SQL 语句列表的文本文件。mysql这些语句由客户端程序解释,就像您在键盘上键入它们一样。
客户mysql端不提供您正在寻找的功能。
但我可以想出一些技巧来达到类似的效果:
在读取 SQL 文件之前创建/填充配置表。然后编写 SQL 文件,使其考虑此表内容:
bash> mysql -e "INSERT INTO config_table VALUES(1, 2, 3)"
bash> mysql < script.sql
Run Code Online (Sandbox Code Playgroud)在 SQL 文件前面添加一些变量声明。然后在脚本的其余部分使用这些变量:
bash> (echo "SET @var=123;" ; cat script.sql) |mysql
[example script.sql]
SELECT * FROM mytable WHERE id = @var;
Run Code Online (Sandbox Code Playgroud)使用一些可以即时替换的占位符编写 SQL 文件,例如sed:
bash> sed "s/__VAR_A__/mytable/g" script.sql |mysql
[example script.sql]
SELECT * FROM __VAR_A__ WHERE id = 123;
Run Code Online (Sandbox Code Playgroud)以上所有内容都非常肮脏。更简洁的解决方案将涉及存储过程或函数。然后您只需将参数作为过程参数传递:
bash> PARAM1='foo'; PARAM2='bar'
bash> mysql -e "CALL MyProc($PARAM1);"
bash> mysql -e "SELECT MyFunc($PARAM2);"
Run Code Online (Sandbox Code Playgroud)
注意:不可能在 SQL 中参数化表名,因此在所有情况下都需要像这样使用动态 SQL(除了sed-based hack,我不推荐这种方法)