¿Por qué no puedo usar una variable como el nombre de la tabla en un procedimiento almacenado?

Estoy tratando de usar una variable como el nombre de la tabla dentro de un procedimiento almacenado y lo está usando como un literal de cadena en lugar de como el nombre real de la tabla. ¿Por qué es esto? ¿Hay alguna otra forma en que debería estar haciendo esto (aparte de hacerlo en PHP)?

DROP PROCEDURE IF EXISTS settonull;

DELIMITER //

CREATE PROCEDURE settonull()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE _tablename VARCHAR(255);
  DECLARE _columnname VARCHAR(255);
  DECLARE cur1 CURSOR FOR SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name, COLUMN_NAME AS column_name FROM information_schema.COLUMNS WHERE IS_NULLABLE = 'YES' AND TABLE_SCHEMA = 'blip_notify' AND table_name, = 'notify_queue' LIMIT 1;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO _tablename, _columnname;

    IF done THEN
      LEAVE read_loop;
    END IF;

    UPDATE _tablename SET _columnname = NULL WHERE LENGTH(TRIM(_columnname)) = 0;

  END LOOP;

  CLOSE cur1;
END//

DELIMITER ;

CALL settonull();

Salida

0 row(s) affected, 1 warning(s)

Execution Time : 0 sec
Transfer Time  : 1.094 sec
Total Time     : 1.095 sec

Note Code : 1305
PROCEDURE settonull does not exist
---------------------------------------------------

0 row(s) affected

Execution Time : 0.002 sec
Transfer Time  : 1.011 sec
Total Time     : 1.014 sec
---------------------------------------------------

Query: call settonull()

Error Code: 1146
Table 'blip_notify._tablename' doesn't exist

Execution Time : 0 sec
Transfer Time  : 0 sec
Total Time     : 0.003 sec
---------------------------------------------------

Respuestas a la pregunta(4)

Su respuesta a la pregunta