【问题标题】:Unix: Passing Param to MYSQL files from BASH Shell ScriptUnix:从 BASH Shell 脚本向 MYSQL 文件传递​​参数
【发布时间】:2014-07-07 05:05:06
【问题描述】:

我想将一些变量从 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 脚本,它可以根据收到的输入从表中加载或选择数据。

谢谢

【问题讨论】:

    标签: mysql shell


    【解决方案1】:

    这是一个旧线程,但我认为可能对某些人仍然有用。像这样的东西应该可以工作:

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

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

    HTH

    【讨论】:

      【解决方案2】:

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

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

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

      • 在读取 SQL 文件之前创建/填充配置表。然后编写您的 SQL 文件,以便将这个表内容考虑在内:

        bash> mysql -e "INSERT INTO config_table VALUES(1, 2, 3)"
        bash> mysql < script.sql
        
      • 在您的 SQL 文件前添加一些变量声明。然后在脚本的其余部分使用这些变量:

        bash> (echo "SET @var=123;" ; cat script.sql) |mysql
        
        [example script.sql]
        SELECT * FROM mytable WHERE id = @var;
        
      • 用一些占位符编写您的 SQL 文件,您可以随时替换,例如 sed:

        bash> sed "s/__VAR_A__/mytable/g" script.sql |mysql
        
        [example 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 中对表名进行参数化,因此在所有情况下都需要使用 dynamic SQL like this(除了基于 sed 的 hack,我会这样做 推荐)

      【讨论】:

        【解决方案3】:

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

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

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

        除此之外,另一种方法是在您的脚本中使用 PREPAREEXECUTE。以下示例允许您创建数据库/模式(如果您想使用存储过程,您需要将它们存储在数据库中),如下所示:

        [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;"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-21
          • 2017-01-22
          • 2016-03-20
          • 2018-03-03
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多