【问题标题】:MySQL: How to pass parameters from command line?MySQL:如何从命令行传递参数?
【发布时间】:2016-08-02 15:59:06
【问题描述】:

在 PostgreSQL 中,您可以在使用 psql 运行查询时从命令行传入命名参数。例如,如果您运行这样的命令:

psql -v v1=12 -f query.sql

在 query.sql 中,您可以像这样引用 v1:

select * from table_1 where id = :v1;

MySQL 是否支持类似的东西?

【问题讨论】:

标签: mysql sql


【解决方案1】:

存储过程示例。

DROP PROCEDURE IF EXISTS so_gibberish.blahBlah7;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE so_gibberish.blahBlah7
(
)
BEGIN
    select CONCAT('The variable is ',@myVar) AS 'theAnswer';
END$$
DELIMITER ;

测试一下:

OS Prompt> mysql -uroot -p so_gibberish -e "set @myVar='Hank Aaron'; call blahBlah7();"
Enter password: ********
+----------------------------+
| theAnswer                  |
+----------------------------+
| The variable is Hank Aaron |
+----------------------------+

so_gibberish 是数据库名称。 -e 表示运行此查询。

@myVar 成为基于连接的用户变量。

【讨论】:

  • OP 询问如何“从命令行传入命名参数”:基本上,mysql 是否提供类似 psql 的命令行开关?说 mysql 在 SQL 级别本身内部提供用户定义的变量并不能回答问题。
【解决方案2】:

是的。
TLDR;使用您问题中的示例:

SET @v1=12;
SELECT * FROM table_1 WHERE id = @v1;

请注意,它们在当前会话结束时被销毁。

详情

MySQL 中的用户定义变量以@ 开头。

这是设置变量的一种方法:

SET @mysite := "example.com";

设置变量时也可以使用MySQL的CONCAT:

SET @home_url := CONCAT("https://www.", @mysite);
SET @site_url := CONCAT(@home_url, "/wordpress");

查看他们的价值观:
SELECT @mysite, @home_url, @site_url;

+-------------+-------------------------+-----------------------------------+
| @mysite     | @home_url               | @site_url                         |
+-------------+-------------------------+-----------------------------------+
| example.com | https://www.example.com | https://www.example.com/wordpress |
+-------------+-------------------------+-----------------------------------+
1 row in set (0.00 sec) 

要更新一些值:

UPDATE wp_options SET option_value = @home_url WHERE option_name = "home";
UPDATE wp_options SET option_value = @site_url WHERE option_name = "siteurl";

不幸的是,似乎没有办法让 MySQL 向您显示所有用户定义变量的列表。 例如SHOWVARIABLES LIKE "%my%" 只会显示(系统?)变量,但不会显示用户定义的变量。

但是,如果您运行的是 MariaDB 10.2(相当于 MySQL 5.7)或更高版本,MariaDB 提供了一个插件来创建用户变量表,因此您可以对其进行查询。
详情请见my answer here

【讨论】:

  • OP 询问如何“从命令行传入命名参数”:基本上,mysql 是否提供类似psql 的命令行开关?说mysql 在 SQL 级别本身内部提供用户定义的变量并不能回答问题。
  • @StefanvandenAkker 据我所知,我给出了他正在寻找的命令,以他的例子,在我的答案的第一行,然后继续提供更多细节,并且指出限制。我不明白这“根本没有解决这个问题”。请指出我的误解。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2016-03-25
  • 2011-09-10
  • 2012-07-26
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多