Un bit supplémentaire qui m'a causé des problèmes.
Je voulais définir le nom de la table et le champ dynamique dans une requête comme @kyle a demandé, mais je voulais aussi stocker le résultat de cette requête dans une variable @a
dans la requête. Au lieu de placer littéralement la variable @a
dans le concat
, vous devez l'inclure dans le texte de la chaîne.
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 ;
Ainsi, dans @sql_text1
affecter le résultat de la requête à @a
dans la chaîne en utilisant:
') INTO @a FROM '
Puis, en @sql_text2
utilisation @a
comme une variable réelle:
,' WHERE ',@keyField,' >= ',
@a ,' ORDER BY '
WOW, quelle chance manière liant! –