Procedure de estadísticas que haga un INSERT o un UPDATE (II)

MySQL_Stored_Procedure_ProgrammingComo vimos en la entrada anterior, creamos una stored procedure para hacer el incremento típico de unas estadísticas.

Pero se puede dar el caso, de que se quieren incremenetar una serie de registros a la vez. Por poner otro ejemplo, tenemos una tabla de tags, donde se almacenan las veces que son asignadas a una entrada. Cuando se crea una entrada, hay que incrementar todas las tags que tiene la entrada asignadas.

A la hora de programarlo, tenemos tres opciones:

  • Por código, se hace una llamada a la procedure por cada tag que tiene la entrada asignada, haciendo tantas llamadas a la procedure como tags asignadas.
  • Modificamos la procedure anterior, para que reciba una cadena de tags con un separador, así la procedure se encarga de ir cortando y cogiendo las tags y incrementandolas.
CREATE PROCEDURE increment_tags (tags VARCHAR(100000))
BEGIN
	DECLARE tag VARCHAR(10);	--Variable donde se irán guardando las tags
 
	WHILE LENGTH(tags)>0 DO
		SET tag = SUBSTRING_INDEX(tags, ',', 1);	--El separador es una coma
		SET tags = SUBSTR (tags, LENGTH(tag)+2);	--La cadena de tags es recortada por el tag actual
		INSERT INTO tbl_tags (tag, ranking) VALUES (tag, 1)
			ON DUPLICATE KEY UPDATE ranking = ranking +1;
	END WHILE;
END
  • Modificar la procedure que va cortando la cadena de tags para que, en vez de incrementar cada vez que coge una tag, haga una cadena de texto que seráuna sentencia preparada, un INSERT con todos las tags a incrementar, y al final la ejecute, consiguiendo una petición a la Base de Datos, y un solo INSERT.
CREATE PROCEDURE increment_tags (tags VARCHAR(100000))
BEGIN
	DECLARE tag VARCHAR(10);	--Variable donde se irán guardando las tags
	DECLARE txt_insert VARCHAR(105000) DEFAULT '';		--Contendrá el INSERT que se va formando
 
	WHILE LENGTH(tags)>0 DO
		SET tag = SUBSTRING_INDEX(tags, ',', 1);
		SET tags = SUBSTR(tags, LENGTH(tag)+2);
		SET txt_insert = CONCAT(txt_insert, ',(', tag, ', 1)');
	END WHILE;
 
	SET @sql = CONCAT('INSERT INTO tags (tag, ranking) VALUES '
					, SUBSTR(txt_insert, 2)
					, ' ON DUPLICATE KEY UPDATE ranking = ranking +1;');
	PREPARE stmt1 FROM @sql;
	EXECUTE stmt1;
	DEALLOCATE PREPARE stmt1;
END

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>