loop - MySQL Pass table name to cursor select
mysql cursor (1)
Creo que no puedes hacerlo de esta manera.
Para lograr esto, debe usar Dynamic SQL.
Tenga en cuenta que tampoco puede abrir un cursor utilizando SQL dinámico. Pero en su caso, parece que no hay necesidad de un cursor.
Si entiendo su código correctamente, puede usar variables de usuario y probablemente logre lo que intenta hacer utilizando 2 declaraciones preparadas dinámicamente.
SET @stmt_text=CONCAT("SELECT @score = SUM(`score`), @maxscore=SUM(`maxscore`) FROM ",
answertable, "WHERE `idParticipation`= ", partid);
PREPARE stmt FROM @stmt_text;
EXECUTE stmt USING @a;
Y luego actualiza los valores usando la declaración siguiente
SET @stmt_text=CONCAT("UPDATE", participationtable, " SET `score`=@score,
`maxscore`=@maxscore WHERE `idParticipation`=", partid);
PREPARE stmt FROM @stmt_text;
EXECUTE stmt USING @a;
DEALLOCATE PREPARE stmt;
Nota: verifique la sintaxis. No puedo probarlo para verificarlo exactamente, pero espero que entiendas la idea.
Quiero que el procedimiento tome el parámetro dependible y partid en la instrucción select, pero cuando lo llamo no reemplaza el parámetro que se puede responder con el valor
la llamada a la call updateTotalScores(''quiz_participation'', ''quiz_answer'', 1)
devuelve el error: 1146 - Table ''quizdb.answertable'' doesn''t exist
pasar el id funciona, pero pasar el nombre de la tabla no, ¿cómo paso el nombre de la tabla a la selección en
DECLARE cur1 CURSOR FOR SELECT SUM(`score`), SUM(`maxscore`) FROM answertable WHERE `idParticipation`=partid;
procedimiento completo:
DELIMITER $$
CREATE PROCEDURE updateTotalScores(IN participationtable CHAR(64), IN answertable CHAR(64), IN partid INT)
BEGIN
DECLARE done INTEGER DEFAULT 0;
DECLARE sscore INTEGER DEFAULT 0;
DECLARE smaxscore INTEGER DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT SUM(`score`), SUM(`maxscore`) FROM answertable WHERE `idParticipation`=partid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO sscore, smaxscore;
UNTIL done = 1
END REPEAT;
CLOSE cur1;
UPDATE participationtable SET `score`=sscore, `maxscore`=smaxscore WHERE `idParticipation`=partid;
END $$
DELIMITER ;
Por completitud
el nombre de la tabla no se puede pasar a un cursor MySql, al menos aún no
http://forge.mysql.com/worklog/task.php?id=3433
la respuesta de abajo (corregida un poco)
DELIMITER $$
CREATE PROCEDURE updateTotalScores(IN participation_table VARCHAR(45), IN answer_table VARCHAR(45), IN part_id INT)
BEGIN
SET @stmt_text=CONCAT("SELECT @score := SUM(`score`), @maxscore := SUM(`maxscore`) FROM ",
answer_table, " WHERE `idParticipation`=", part_id);
PREPARE stmt FROM @stmt_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt_text=CONCAT("UPDATE ", participation_table,
" SET `score`=?, `maxscore`=? WHERE `idParticipation`=", part_id);
PREPARE stmt FROM @stmt_text;
EXECUTE stmt USING @score, @maxscore;
DEALLOCATE PREPARE stmt;
END $$