Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Ejemplo de cursor con Update para MySql

4 febrero, 2015

Este es un sencillo ejemplo de como crear un procedimiento con un cursor en MySql.

Es un cursor con la típica Select que recupera un par de variables que más tarde utilizaremos en la where de un Update, para poder actualizar uno a uno cada registro que nos interese.

Tiene un bluce (LOOP) que ira recuperando nuevos valores para el Update hasta que no tenga más datos y finalmente se salga del bucle.

El código está comentado por lo que es realmente fácil seguir los pasos, pero si tienen dudas pues a busca a Google, es broma 🙂 , si tienes dudas deja un comentario y te intento echar una mano.

El código:

DROP PROCEDURE IF EXISTS cargar_imagen;
DELIMITER $$
CREATE PROCEDURE cargar_imagen (
) BEGIN
-- Variables donde almacenar el id que de la SELECT
  DECLARE i_idimagen BIGINT;
  DECLARE v_imagen VARCHAR(250);
-- Variable para controlar el fin del bucle
  DECLARE findelbucle INTEGER DEFAULT 0;
 
-- La SELECT que queremos
  DECLARE cursor_elidimagen CURSOR FOR 
    SELECT imagen,id_producto FROM imagenes ;
 
-- Cuando no existan mas datos findelbucle se pondra a 1
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET findelbucle=1;
--  DECLARE CONTINUE HANDLER FOR NOT FOUND SET @hecho = TRUE;
 
  OPEN cursor_elidimagen;
  bucle: LOOP
    FETCH cursor_elidimagen INTO v_imagen,i_idimagen;
    IF findelbucle = 1 THEN
       LEAVE bucle;
    END IF;
 
  UPDATE oc_product SET image= v_imagen WHERE model=i_idimagen;
 
  END LOOP bucle;
 
  CLOSE cursor_elidimagen;
END$$
DELIMITER ;

Si tienes alguna duda deja un comentario 😉 y no se te olvide darme un +1 en Google plus Gracias!

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Comentarios (7)

Quisiera saber de un cursor para generar una falta en un lapso de tiempo, recorriendo los datos de los alumnos y el que no llego me genere una falta.

Responder

Hola!
ummm, tendrías que utilizar la SELECT para conseguir los registros que quieres utilizar

DECLARE cursor_elidimagen CURSOR FOR
SELECT imagen,id_producto FROM imagenes

y el update para generar la “falta” en los registros de los alumnos.

UPDATE oc_product SET image= v_imagen WHERE model=i_idimagen;

Tendrías que adaptar el cursor a tus datos y a lo que necesitas realizar.

De igual manera es bastante imposible definirlo sin tener la estructura de la base de datos y sobre todo la idea exacta.

un saludo!

Responder

Gracias por compartir tus conocimientos y por el tiempo, es de gran ayuda. Saludos

Responder

gracias por la ayuda que nos das, con ejemplo sencillo y muy practico, como pocos

Responder

Una consulta como hago un cursor para que me llene campos consecutivos de una columna de una tabla y que comiencen en el numero que yo deseo?

Responder

ESTUPENDO EJEMPLO.

Responder

Hola yo hice un cursor con 2 loop pero solo me hace 1 vez el insert cuando la tabla esta cargada ya no me lo vuelve a hacer me ayudas por favor.
BLOCK1: begin
/* Variable para controlar el fin del bucle1*/
DECLARE v1finished INTEGER DEFAULT 0;
/*variables que almacenan el valor del primer select*/
DECLARE v1emp_codigo VARCHAR(10);
DECLARE v1TJC_CODIGO VARCHAR(10);
DECLARE v1USC_NOMBRE VARCHAR(250);
DECLARE v1TJC_SALDOLEALTAD DOUBLE (10,2);
DECLARE v1cue_email varchar (50);
DECLARE v1CAT_CODIGO VARCHAR(10);
/* El SELECT que vamos a ejecutar*/
DECLARE cursor1 CURSOR FOR
SELECT EMP_CODIGO,TJC_CODIGO,USC_NOMBRE,TJC_SALDOLEALTAD,CUE_EMAIL,CAT_CODIGO
FROM tmp_UsuLealtad ORDER BY TJC_CODIGO;
— Condición de salida
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v1finished=1;

OPEN cursor1;
LOOP1: loop
FETCH cursor1 INTO v1emp_codigo,v1TJC_CODIGO,v1USC_NOMBRE,v1TJC_SALDOLEALTAD,v1cue_email,v1CAT_CODIGO;
IF v1finished = 1 THEN
CLOSE cursor1;
LEAVE LOOP1;
END IF;

BLOCK2: begin
— Variable para controlar el fin del bucle2
DECLARE v2finished INTEGER DEFAULT 0;
/*variables que almacenan el valor del segundo select*/
declare v2EMP_CODIGO VARCHAR(10);
declare v2EMP_NOMBRE varchar(50);
declare v2CLU_CODIGO varchar(10);
declare v2CLU_DESCRIPCION varchar(150);
declare v2CAT_NOMBRE varchar(150);
declare v2CAP_CODIGO varchar(10);
declare v2PRE_CODIGO varchar(10);
declare v2cap_valor double(10,2);
declare v2PRE_NOMBRE varchar(100);
declare v2con_codigo varchar(10);
declare v2pre_descripcion varchar(150);

declare cursor2 cursor for
select distinct emp_codigo,emp_nombre,clu_codigo,clu_descripcion,cat_codigo,
cat_nombre,pre_codigo,pre_descripcion,cap_valor,pre_nombre,con_codigo
from tmp_PremioEmpLealtad where (CAP_VALOR = v1TJC_SALDOLEALTAD OR CAP_VALOR < v1TJC_SALDOLEALTAD)
AND CAT_CODIGO = v1CAT_CODIGO order by cap_valor asc;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v2finished=1;

open cursor2;
LOOP2: loop
fetch from cursor2
into v2EMP_CODIGO,v2EMP_NOMBRE,v2CLU_CODIGO,v2CLU_DESCRIPCION,
v2CAP_CODIGO,v2CAT_NOMBRE,v2PRE_CODIGO,v2pre_descripcion,v2cap_valor,v2PRE_NOMBRE,v2con_codigo;

call CodigoMaximo('email_premio','EMAIL_ID',10,@CODIGO);

IF v2finished = 1 THEN
CLOSE cursor2;
LEAVE LOOP2;
END IF;
insert INTO email_premio (EMAIL_ID,
TJC_CODIGO,USC_NOMBRE,TJC_SALDOLEALTAD,EMAIL_LEALTAD,FECH_ACTUAL,PRE_CODIGO,PRE_NOMBRE,
CON_CODIGO,ESTADO,CAP_VALOR,PRE_DESCRIPCION) VALUES (@CODIGO,v1TJC_CODIGO,v1USC_NOMBRE,
v1TJC_SALDOLEALTAD,v1cue_email,now(),v2PRE_CODIGO,v2PRE_NOMBRE,v2con_codigo,1,v2cap_valor,v2pre_descripcion);
end loop LOOP2;
end BLOCK2;
end loop LOOP1;
end BLOCK1;

Responder