Iniciar sesión

Crear un cursor

Rodrigo

Traducido por Rodrigo

Creado 2014-06-27 23:03:00 Modificado 2014-06-28 06:23:00

Un cursor de base de datos te permite manipular datos para fila, si necesitas un proceso que te permita actualizar cada fila con datos diferentes, necesitas un cursor, por ejemplo dígamos que tienes en tu tabla nombre y apellido y quieres llenar el campo nombrecompleto concatenando los 2 campoas anteriores, no puedes usar una sentencia update, porque actualizará el nombrecompleto de todas las filas con el mismo valor

En este tutorial vamos a desarrollar un cursor que va a generar contraseñas para cada usuario, basandose en sus propios atributos

este tutorial fue escrito usando el siguiente equipo:

  • Hardware:           laptop Thinkpad E430 Intel I5, 4gb Ram, 500gb HDD
  • SO:                     x86_64 GNU/Linux Ubuntu 14.10
  • Kernel:                3.13.0-29-generic
  • IDE/Text editor:   MySql workbench 6.0
  • DB:                      Mysql 5.5.31
  • Cliente MySql:      MySql workbench 6.0

 

1.- Creando la bd:

Primero necesitamos una base de datos para trabajar en el cursor, tomemos el siguiente sciprt y ejecutémoslo en mysql

CREATE DATABASE tutorial;
USE tutorial;

CREATE TABLE users(
   id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(45) NOT NULL,
   birthdate DATE NOT NULL,
   password VARCHAR(45) NOT NULL
);

INSERT INTO users(name, birthdate, password)VALUES('Rodrigo', '1991-04-02','');
INSERT INTO users(name, birthdate, password)VALUES('Mike'     , '1993-06-12','');
INSERT INTO users(name, birthdate, password)VALUES('Joe'       , '1989-09-22','');
INSERT INTO users(name, birthdate, password)VALUES('José'      , '1996-12-11','');
INSERT INTO users(name, birthdate, password)VALUES('Xing'       , '1990-07-23','');

 

2.- Creando el cursor:

ahora como pueden ver no hay ninguna password definida para cada usuario, o podriamos tener, pero queremos resetear todas las passwords, como sea, necesitamos un cursor

DELIMITER $$
CREATE PROCEDURE genera_passwords()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE id_user INT;
  DECLARE nombre VARCHAR(45);
  DECLARE fec_nac VARCHAR(10);
  DECLARE cur_map CURSOR FOR SELECT id, name, birthdate FROM users;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur_map;
  read_loop: LOOP
    FETCH cur_map INTO id_user, nombre, fec_nac;
    IF done THEN
      LEAVE read_loop;
    END IF;
	  UPDATE users SET PASSWORD=CONCAT(nombre, SUBSTRING(fec_nac, 1, 4)) WHERE id=id_user;
  END LOOP;
  CLOSE cur_map;
END$$
DELIMITER ;

Lo primero que puedes notar es que estamos ejecutando un cursor dentro de un procedimiento almacenado, no puedes ejecutar un cursor por sí mismo, en mysql, los cursores sólo pueden ser ejecutados dentro de programa almacenado (stored procedure)

"Se soportan cursores simples dentro de procedimientos y funciones almacenadas" Mysql sitio oficial

3.- Ejecutando el cursor:

hasta este punto, hemos terminado, excutemos el procedimiento almacenado y veamos los cambios en los datos

call genera_passwords;

hemos ejecutado el cursor dentro de el procedimiento almacenado, ahora deberíamos tener passwords para todos, dependiendo de sus nombres y fechas de nacimiento

select*from users;

 

Descárgalo en https://docs.google.com/file/d/0BwOqSob-RrBOVVh0V1pveDd1bk0/edit?pli=1

4.- Conclusión:

Con los cursores podemos manipular datos para fila sin afectar a las otras, puedes recorrer fila tras fila usando los datos para esa fila específica en donde estás situado, para esa misma fila específica en donde estás situado. Recomiendo usar mysql workbench, les dejo un pantallazo

5.- Links de referencias:




comments powered by Disqus