在mysql sproc中使用表名的variables
我试图传递一个表名到我的MySQL存储过程使用此sprocselectclosures不同的表,但它不工作…
这是我正在尝试:
CREATE PROCEDURE `usp_SelectFromTables`( IN TableName varchar(100) ) BEGIN SELECT * FROM @TableName; END
我也试过它没有@符号,只是告诉我,TableName不存在…我知道:)
它依赖于数据库pipe理系统,但是这个表示法通常需要dynamicSQL,并且遇到这样的问题,即函数的返回值在执行时依赖于input。 这给了系统的含义。 作为一般规则(因此可能会受到例外),DBMS不允许使用占位符(参数)作为查询的结构元素,例如表名或列名; 它们只允许您指定值,如列值。
有些DBMS有存储过程支持,可以让你build立一个SQLstring,然后使用“准备”或“立即执行”或类似的操作。 但是,请注意,您突然很容易受到SQL注入攻击 – 可以执行您的过程的人可以部分控制SQL执行的部分内容。
SET @cname:='jello'; SET @vname:='dwb'; SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc'); PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt;
额外的一点,导致我的问题。
我想在@kyle询问的时候在查询中dynamic地设置表名和字段,但是我也想把查询的结果存储到查询中的variables@a
中。
不需要将variables@a
放入concat
,而需要将其作为string文本的一部分包含@a
。
delimiter // CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT) BEGIN SET @table_name = table_name; SET @keyField = keyField; SET @maxId = maxId; SET @num_rows = num_rows; SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name); PREPARE stmt1 FROM @sql_text1; EXECUTE stmt1; DEALLOCATE PREPARE stmt1; loop_label: LOOP SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1'); PREPARE stmt2 FROM @sql_text2; EXECUTE stmt2; DEALLOCATE PREPARE stmt2; ...Additional looping code... END LOOP; END // delimiter ;
所以在@sql_text1
将查询的结果分配给@a
:
') INTO @a FROM '
然后在@sql_text2
使用@a
作为实际variables:
,' WHERE ',@keyField,' >= ',
@a ,' ORDER BY '