loop mysql sql stored-procedures mysql-error-1146

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 $$