我试图在游标中的MySQL中添加字符串,我需要它用于我的动态SQL查询。
我在光标
之前设置了字符串ESQL3 = "FIRST PART OF QUERY ";
现在在游标中我想添加查询的其余部分,我使用CONCAT(),但我觉得它没有完成这项工作。
SET @ESQL3 = CONCAT(ESQL3, aggregate_function, "(", table_name, ")" as ", table_name, " , ");
结果被声明为查询的第一部分+该函数的最后一次调用。 我已经搜索了很多答案。
谢谢
答案 0 :(得分:1)
您希望在@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
之间存在 no 关系。
在循环内部,当您追加到@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
之前有空格。)