sql >> Base de Datos >  >> RDS >> Mysql

Cursor dinámico en procedimiento almacenado

Del Manual de MySQL

Sin embargo, hay 2 formas.

El primero es para casos en los que absolutamente solo un usuario a la vez ejecutará el procedimiento. Se puede usar una declaración de preparación para crear una vista con el SQL dinámico y el cursor puede seleccionar desde esta vista con nombre estático. Casi no hay impacto en el rendimiento. Desafortunadamente, estas vistas también son visibles para otros usuarios (no existe una vista temporal), por lo que esto no funcionará para varios usuarios.

Análogamente, se puede crear una tabla temporal en la declaración de preparación y el cursor puede seleccionar de la tabla temporal. Solo la sesión actual puede ver una tabla temporal, por lo que se resuelve el problema de varios usuarios. Pero esta solución puede tener un impacto significativo en el rendimiento, ya que se debe crear una tabla temporal cada vez que se ejecuta el proceso.

En pocas palabras:¡todavía necesitamos cursores para poder crearlos dinámicamente!

Este es un ejemplo del uso de una vista para pasar el nombre de la tabla y el nombre de la columna a un cursor desde foros mysql

DELIMITER // 
DROP PROCEDURE IF EXISTS test_prepare// 

CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50)) 
BEGIN 
DECLARE cursor_end CONDITION FOR SQLSTATE '02000'; 
DECLARE v_column_val VARCHAR(50); 
DECLARE done INT DEFAULT 0; 
DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw; 
DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1; 

SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename); 
select @query; 
PREPARE stmt from @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

OPEN cur_table; 
FETCH cur_table INTO v_column_val; 
WHILE done = 0 DO 
SELECT v_column_val; 
FETCH cur_table INTO v_column_val; 
END WHILE; 
CLOSE cur_table; 

DROP VIEW test_prepare_vw; 

END; 
// 

DELIMITER ;