MySQL 向自身添加字符串
MySQL adding string to itself
我正在尝试在游标中的 MySQL 中向自身添加字符串,我的动态 SQL 查询需要它。
我在光标前设置了我的字符串
ESQL3 = "FIRST PART OF QUERY ";
现在在游标中我想添加查询的其余部分,我正在使用 CONCAT() 但我觉得它没有完成这项工作。
SET @ESQL3 = CONCAT(ESQL3, aggregate_function, "(", table_name, ")" as ", table_name, " , ");
结果声明为查询的第一部分 + 该函数的最后一次调用。
我已经搜索了很多答案。
谢谢
您似乎想引用用户定义的变量 @ESQL3
作为 CONCAT
函数中的参数,而不是存储的程序变量 ESQL3
.
改变这个:
SET @ESQL3 = CONCAT(ESQL3, ...
对此:
SET @ESQL3 = CONCAT(@ESQL3, ...
^
(MySQL存储的程序变量和MySQL用户自定义变量是两个不同的东西。即ESQL3
和@ESQL3
不是同一个变量。它们是两个根本不同的变量。
编辑
此外,其余的 CONCAT 参数看起来有点古怪。这些看起来不错:
, aggregate_function
, "("
, table_name
但这看起来不对:
, ")" as ", table_name, " , ");
我认为 CONCAT 中不允许使用 "as" 关键字,并且不会将其视为字符串文字。
也许您的意思是将 "as" 作为字符串值的一部分包含在内,如下所示:
, ") as "
, table_name
, " , "
跟进
您需要初始化 @ESQL3
。您发布的代码中没有发生这种情况。用户定义变量的范围是 session,该变量的值跨语句持续存在。下次在会话中引用它时,它将具有上次分配给它的任何值。
并且在您初始化它时,请省略尾随的逗号。将下一个表达式附加到 SELECT 列表时添加逗号。
SET @ESQL3 = "CREATE TABLE Obroty AS SELECT Towar";
^ ^
注意我们需要初始化后面引用的用户自定义变量。
存储过程变量 ESQL3
设置的值一点都不重要。与用户定义变量 @ESQL3
.
没有 无 关系
在循环内,当您追加到 @ESQL3
时,在表达式之前包含逗号文字,而不是在表达式之后。像这样:
SET @ESQL3 = CONCAT(@ESQL3, ", ", funkcja, "(", miech, ") as ", miech );
^^^^
因此,进入循环后,@ESQL3
将具有值
CREATE TABLE Obroty AS SELECT Towar
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
第一次通过 read_loop
之后,它的值将类似于
CREATE TABLE Obroty AS SELECT Towar, SUM(foo) AS foo
^^^^^^^^^^^^^^^^^
下一次循环,它的值会像
CREATE TABLE Obroty AS SELECT Towar, SUM(foo) AS foo, SUM(bar) AS bar
^^^^^^^^^^^^^^^^^
退出循环后,您将准备好附加“FROM whatever
。(确保在 FROM
之前有 space。)
我正在尝试在游标中的 MySQL 中向自身添加字符串,我的动态 SQL 查询需要它。
我在光标前设置了我的字符串
ESQL3 = "FIRST PART OF QUERY ";
现在在游标中我想添加查询的其余部分,我正在使用 CONCAT() 但我觉得它没有完成这项工作。
SET @ESQL3 = CONCAT(ESQL3, aggregate_function, "(", table_name, ")" as ", table_name, " , ");
结果声明为查询的第一部分 + 该函数的最后一次调用。 我已经搜索了很多答案。
谢谢
您似乎想引用用户定义的变量 @ESQL3
作为 CONCAT
函数中的参数,而不是存储的程序变量 ESQL3
.
改变这个:
SET @ESQL3 = CONCAT(ESQL3, ...
对此:
SET @ESQL3 = CONCAT(@ESQL3, ...
^
(MySQL存储的程序变量和MySQL用户自定义变量是两个不同的东西。即ESQL3
和@ESQL3
不是同一个变量。它们是两个根本不同的变量。
编辑
此外,其余的 CONCAT 参数看起来有点古怪。这些看起来不错:
, aggregate_function
, "("
, table_name
但这看起来不对:
, ")" as ", table_name, " , ");
我认为 CONCAT 中不允许使用 "as" 关键字,并且不会将其视为字符串文字。
也许您的意思是将 "as" 作为字符串值的一部分包含在内,如下所示:
, ") as "
, table_name
, " , "
跟进
您需要初始化 @ESQL3
。您发布的代码中没有发生这种情况。用户定义变量的范围是 session,该变量的值跨语句持续存在。下次在会话中引用它时,它将具有上次分配给它的任何值。
并且在您初始化它时,请省略尾随的逗号。将下一个表达式附加到 SELECT 列表时添加逗号。
SET @ESQL3 = "CREATE TABLE Obroty AS SELECT Towar";
^ ^
注意我们需要初始化后面引用的用户自定义变量。
存储过程变量 ESQL3
设置的值一点都不重要。与用户定义变量 @ESQL3
.
在循环内,当您追加到 @ESQL3
时,在表达式之前包含逗号文字,而不是在表达式之后。像这样:
SET @ESQL3 = CONCAT(@ESQL3, ", ", funkcja, "(", miech, ") as ", miech );
^^^^
因此,进入循环后,@ESQL3
将具有值
CREATE TABLE Obroty AS SELECT Towar
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
第一次通过 read_loop
之后,它的值将类似于
CREATE TABLE Obroty AS SELECT Towar, SUM(foo) AS foo
^^^^^^^^^^^^^^^^^
下一次循环,它的值会像
CREATE TABLE Obroty AS SELECT Towar, SUM(foo) AS foo, SUM(bar) AS bar
^^^^^^^^^^^^^^^^^
退出循环后,您将准备好附加“FROM whatever
。(确保在 FROM
之前有 space。)