Unix:如何从BASH Shell脚本中向MYSQL文件传递参数

5
我希望你能够帮助我将一些变量从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脚本,可以根据接收到的输入加载或选择数据表。
谢谢

3个回答

3

无法向 SQL 文件传递参数。SQL 文件只是包含一系列 SQL 语句的文本文件。这些语句将由 mysql 客户端程序解释,并且完全等同于您在键盘上输入它们。

mysql 客户端程序没有提供您要查找的功能。

但我可以想到一些技巧来实现类似的效果:

  • create/populate a configuration table prior to reading your SQL file. Then write your SQL file so that it takes this table contents into account:

    bash> mysql -e "INSERT INTO config_table VALUES(1, 2, 3)"
    bash> mysql < script.sql
    
  • prepend your SQL file with some variables declarations. Then use these variables in the rest of your script:

    bash> (echo "SET @var=123;" ; cat script.sql) |mysql
    
    [example script.sql]
    SELECT * FROM mytable WHERE id = @var;
    
  • write your SQL file with some placeholders that your replace on the fly, e.g with sed:

    bash> sed "s/__VAR_A__/mytable/g" script.sql |mysql
    
    [example script.sql]
    SELECT * FROM __VAR_A__ WHERE id = 123;
    
以上内容相当混乱。更为清晰的解决方案将涉及存储过程或函数。然后,您只需将参数作为过程参数传递: (参考文献)
bash> PARAM1='foo'; PARAM2='bar'
bash> mysql -e "CALL MyProc($PARAM1);"
bash> mysql -e "SELECT MyFunc($PARAM2);"

注意: SQL中不可能对表名进行参数化处理,因此您将需要采用类似这样的动态SQL(除了基于sed的黑客方法之外,我不建议使用)来处理所有情况。

2

这是一个旧帖子,但我认为对一些人仍然有用。像这样的代码可以发挥作用:

mysql -uroot -p123xyzblabla MyMYSQLDBName -e "set @testVar='customer_name'; source mysqlfile.sql;"

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

希望对你有所帮助。


1
在这个或其他帖子中已经回答了传递参数的方法。然而,针对你问题中的示例,我想补充说明,你不能使用变量声明方法作为表名的占位符,因为文档中说到:
“用户变量旨在提供数据值。它们不能直接用作 SQL 语句中的标识符或标识符的一部分,例如在期望表名或数据库名的上下文中。”
如果你想要使用表名参数,你仍然可以使用 @RandomSeed 提供的 sed 或存储过程或函数。
除此之外,另一种方法是在你的脚本中使用 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;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接