首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix:从BASH Shell脚本向MYSQL文件传递参数

问Unix:从BASH Shell脚本向MYSQL文件传递参数
EN

Stack Overflow用户
提问于 2014-07-07 13:05:06
回答 3查看 7K关注 0票数 4

我想把一些变量从bash shell脚本传递给mysql文件。

这是我的shell脚本。

代码语言:javascript
复制
#!/bin/bash
echo $0 Started at $(date)
mysql -uroot -p123xyzblabla MyMYSQLDBName<mysqlfile.sql  PARAM_TABLE_NAME

请注意,它是MYSQL而不是SQLPLUS

我的MYSQL.sql,我想读取和使用传递的参数/实参(PARAM_TABLE_NAME)

代码语言:javascript
复制
select count(*) from PARAM_TABLE_NAME

问题1:将变量(PARAM_TABLE_NAME)传递给sql文件(mysqlfile.sql)的正确语法是什么?问题2:如何打印sql文件(mysqlfile.sql)中的变量(PARAM_TABLE_NAME)?

基本上,我想使通用的SQL脚本,可以加载或从表中选择数据的基础上收到的输入。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-07-07 17:44:15

没有将参数传递给SQL文件这回事。SQL文件只不过是包含SQL语句列表的文本文件。这些语句由mysql客户端程序解释,就像您在键盘上键入它们一样。

mysql客户端没有提供您正在寻找的功能。

但我可以想出几个小技巧来达到类似的效果:

在读取您的SQL文件之前,

  • create/populate一个配置表。然后编写SQL文件,以便它将此表的内容考虑在内:

bash> mysql -e "INSERT INTO config_table VALUES(1,2,3)“bash> mysql <使用一些变量声明来插入您的SQL文件。然后在脚本的其余部分中使用这些变量:

bash> (echo "SET @var=123;“;cat script.sql) |mysql示例script.sql SELECT * FROM mytable WHERE id =@var;

  • 使用一些动态替换的占位符编写您的SQL文件,例如使用sed:

bash> sed "s/ __VAR_A__ /mytable/g“script.sql |mysql示例script.sql SELECT * FROM __VAR_A__ WHERE id = 123;

所有这些都是很脏的。一个更干净的解决方案是使用stored procedures or functions。然后,您只需将参数作为过程参数进行传递:

代码语言:javascript
复制
bash> PARAM1='foo'; PARAM2='bar'
bash> mysql -e "CALL MyProc($PARAM1);"
bash> mysql -e "SELECT MyFunc($PARAM2);"

注意:在SQL中不可能将表名参数化,因此在所有情况下都需要求助于 (除了基于sed__的hack,我不推荐 not )。

票数 3
EN

Stack Overflow用户

发布于 2015-12-15 23:40:40

这是一个老帖子,但我认为对某些人来说可能仍然有用。像这样的东西应该是有效的:

代码语言:javascript
复制
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @testVar='customer_name'; source mysqlfile.sql;"

现在,您可以在mysqlfile.sql文件中使用@testVar (customer_name)。

HTH

票数 1
EN

Stack Overflow用户

发布于 2017-02-07 18:34:28

传递参数的方法已经在这个或其他线程中得到了回答。但是,针对您问题中的示例,我想补充一点,您不能使用变量声明方法作为表名的占位符,正如文档所说的那样:

用户变量旨在提供数据值。它们不能在SQL语句中作为标识符或标识符的一部分直接使用,例如在表名或数据库名应为的上下文中。

如果要使用表名参数,仍可以使用sed或@RandomSeed回答的存储过程或函数

除此之外,另一种方法是在脚本中使用PREPARE和EXECUTE。下面的示例允许您创建数据库/模式(如果您希望使用存储过程,则需要将其存储在数据库中),如下所示:

代码语言:javascript
复制
[myscript.sql]
set @s=CONCAT("CREATE DATABASE ", @dbname);
PREPARE stmt FROM @s;
EXECUTE stmt;

然后使用其他问题中提出的任何语法来设置@dbname变量:

代码语言:javascript
复制
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @dbname='mydatabase'; source myscript.sql;"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24603349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档