我正在尝试在游标中的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
。您发布的代码中没有发生这种情况。用户定义变量的范围是会话,该变量的值在语句之间持久存在。下次在会话中引用它时,它将具有最后为其分配的任何值。并且在初始化它时,请不要使用结尾的逗号。将下一个表达式追加到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
之前有空格。)关于mysql - MySQL自身添加字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28202080/