我正在尝试在游标中的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/

10-11 00:24