我想把一些变量从bash shell脚本传递给mysql文件。
这是我的shell脚本。
#!/bin/bash
echo $0 Started at $(date)
mysql -uroot -p123xyzblabla MyMYSQLDBName<mysqlfile.sql PARAM_TABLE_NAME请注意,它是MYSQL而不是SQLPLUS
我的MYSQL.sql,我想读取和使用传递的参数/实参(PARAM_TABLE_NAME)
select count(*) from PARAM_TABLE_NAME问题1:将变量(PARAM_TABLE_NAME)传递给sql文件(mysqlfile.sql)的正确语法是什么?问题2:如何打印sql文件(mysqlfile.sql)中的变量(PARAM_TABLE_NAME)?
基本上,我想使通用的SQL脚本,可以加载或从表中选择数据的基础上收到的输入。
谢谢
发布于 2014-07-07 17:44:15
没有将参数传递给SQL文件这回事。SQL文件只不过是包含SQL语句列表的文本文件。这些语句由mysql客户端程序解释,就像您在键盘上键入它们一样。
mysql客户端没有提供您正在寻找的功能。
但我可以想出几个小技巧来达到类似的效果:
在读取您的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;
sed:bash> sed "s/ __VAR_A__ /mytable/g“script.sql |mysql示例script.sql SELECT * FROM __VAR_A__ WHERE id = 123;
所有这些都是很脏的。一个更干净的解决方案是使用stored procedures or functions。然后,您只需将参数作为过程参数进行传递:
bash> PARAM1='foo'; PARAM2='bar'
bash> mysql -e "CALL MyProc($PARAM1);"
bash> mysql -e "SELECT MyFunc($PARAM2);"注意:在SQL中不可能将表名参数化,因此在所有情况下都需要求助于 (除了基于sed__的hack,我不推荐 not )。
发布于 2015-12-15 23:40:40
这是一个老帖子,但我认为对某些人来说可能仍然有用。像这样的东西应该是有效的:
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @testVar='customer_name'; source mysqlfile.sql;"现在,您可以在mysqlfile.sql文件中使用@testVar (customer_name)。
HTH
发布于 2017-02-07 18:34:28
传递参数的方法已经在这个或其他线程中得到了回答。但是,针对您问题中的示例,我想补充一点,您不能使用变量声明方法作为表名的占位符,正如文档所说的那样:
用户变量旨在提供数据值。它们不能在SQL语句中作为标识符或标识符的一部分直接使用,例如在表名或数据库名应为的上下文中。
如果要使用表名参数,仍可以使用sed或@RandomSeed回答的存储过程或函数
除此之外,另一种方法是在脚本中使用PREPARE和EXECUTE。下面的示例允许您创建数据库/模式(如果您希望使用存储过程,则需要将其存储在数据库中),如下所示:
[myscript.sql]
set @s=CONCAT("CREATE DATABASE ", @dbname);
PREPARE stmt FROM @s;
EXECUTE stmt;然后使用其他问题中提出的任何语法来设置@dbname变量:
mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @dbname='mydatabase'; source myscript.sql;"https://stackoverflow.com/questions/24603349
复制相似问题