Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Cursor en mysql

Estas en el tema de Cursor en mysql en el foro de Mysql en Foros del Web. Hola, tengo una consulta sobre los cursores. Tengo una tabla temporal a la que le inserto un registro al inicio del procedimiento y luego va ...
  #1 (permalink)  
Antiguo 29/09/2010, 10:40
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Cursor en mysql

Hola, tengo una consulta sobre los cursores.
Tengo una tabla temporal a la que le inserto un registro al inicio del procedimiento y luego va recorriendo la tabla mediante un cursor....

DECLARE vCONT INT DEFAULT 0;
DECLARE CUR CURSOR FOR
SELECT ID
FROM TMPS; -- tabla temporal
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vCONT = 1;

El tema es que dentro del cursor tengo una condicion que permite insertar registros a la tabla temporal y necesito controlar esos registros nuevos, pero el cursor solo me devuelve el primero, como hago para que siga el ciclo hasta que termine de controlat todos los registros de la tabla??

Espero se haya entendido el problema...

Gracias
  #2 (permalink)  
Antiguo 29/09/2010, 10:46
 
Fecha de Ingreso: abril-2010
Mensajes: 23
Antigüedad: 14 años
Puntos: 3
Respuesta: Cursor en mysql

No he entendido muy bien la pregunta xD

MySQL tiene un PL/SQL muy tonto, y si pones esto: DECLARE CONTINUE HANDLER FOR NOT FOUND SET vCONT = 1;

en cuanto haya un not found (por ejemplo, si haces un SELECT que lanza un not found dentro, se rompe el ciclo y el cursor termina

la mejor solución para estos casos, es si haces algo muy complicado en medio, te hagas una FUNCITON aparte y la llames desde dentro del cursor.

No sé si te soluciona algo esto... xD
  #3 (permalink)  
Antiguo 29/09/2010, 12:28
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Cursor en mysql

Tendria que sacar NOT FOUND y que tengo que poner para que siga el select de la tabla? y cuando termina? La verdad que no entiendo mucho porque lo hace asi, en sql server lo hace sin ningun problema.

Te explico lo que quiero hacer, tengo una tabla por ejemplo "TABLA_A" con los siguientes campos, id,nombre,id_a, donde id_a es otro id de la misma tabla, es lo que llamamos padre e hijo, y que a su ves el hijo tiene un hijo y asi....
Entonces si tengo por ejemplo el id 2,3 que tienen como padre el id 1 y a su ves el id 3 es padre del id 4 y quiero eliminar el 1, me tiene que eliminar el 2,3,4... por eso pense de hacer un cursor y que me vaya insertando en la tabla temporal los hijos,nietos, etc del id 1, no se si habra otra forma de hacerlo...

Espero no haberla complicado mas.
  #4 (permalink)  
Antiguo 30/09/2010, 05:57
 
Fecha de Ingreso: abril-2010
Mensajes: 23
Antigüedad: 14 años
Puntos: 3
Respuesta: Cursor en mysql

Por lo que veo quieres borrar "en cascada" si borran a un padre...

Soluciones hay infinitas, la tuya no es mala, y no estaría mal que la hicieras, así te pegas con PL/SQL de mysql que te vendrá bien para otras cosas.

No obstante, te voy a proponer una solución la leche de sencilla y rápida.

Imaginate lo que dices, la TABLA_A con id e id_a
creas un FK (Supongo que lo sabes, pero si tienes dudas de FK pregúntame) que sea:
Tabla origen: Tabla_a
id_origen: id_a
Tabla destino: Tabla_a
id_destino; id
y activas " ON DELETE CASCADE"

Y listo, esto hará que si borras un registro, este borrará a sus hijos, y si sus hijos son borrados, a su vez borraran los suyos,

No sé si se entiende.

Si quieres hacerlo por procedures y functions, también podemos hacerlo :)
  #5 (permalink)  
Antiguo 30/09/2010, 06:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Cursor en mysql

Muchas graciaaas!!! anduvo perfecto, no sabia que podia hacerlo asi, esto es geniaaal!!! ;)
  #6 (permalink)  
Antiguo 30/09/2010, 07:05
 
Fecha de Ingreso: abril-2010
Mensajes: 23
Antigüedad: 14 años
Puntos: 3
Respuesta: Cursor en mysql

Me alegro haber sido de ayuda :)

No dejes de hacer cositas en PL/SQL, que es antipático en algunos aspectos y los cursores un coñazo, pero luego te ayudarán a hacer de todo :D

Un saludo!;
  #7 (permalink)  
Antiguo 30/09/2010, 08:25
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Cursor en mysql

Otra cosita :S, como seria para actualizar??

Si por ejemplo le agrego a la tabla un campo status, un bit que me indica si el registro esta o no disponible para mostrar.
Si el status padre esta en 1 y lo quiero cambiar a cero, automaticamente tendria que cambiar el status de sus hijo, nietos....etc

Pense que funcionaria igual que el delete, pero no :(, lei que no actualiza los demas campos de la tabla, como seria esto??

Gracias!!! :)
  #8 (permalink)  
Antiguo 30/09/2010, 14:58
 
Fecha de Ingreso: abril-2010
Mensajes: 23
Antigüedad: 14 años
Puntos: 3
Respuesta: Cursor en mysql

Lo lógico es que con cambiar el status del padre, sin hacer un update al hijo, la aplicación ya supiera que está "oculto"

Pero si por aplicación no lo puedes hacer, y necesitas por narices poner el status en la base de datos se actualice, la integrad referencial no te va a servir :(, ahí ya o lo haces por aplicacion, o lo haces por PL/SQL.

crea una function que te devuelva el id del hijo, y 0 si no tiene, en plan

Código SQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS `dame_hijo`$$
  4.  
  5. CREATE FUNCTION `dame_hijo`$$(id_cosa INT) RETURNS INT(11)
  6. BEGIN
  7. DECLARE id_del_hijo FLOAT DEFAULT 0;
  8.  
  9. SELECT id_hijo INTO id_del_hijo FROM tu_tabla WHERE ID=id_cosa;
  10.  
  11. RETURN id_del_hijo;
  12. END$$
  13.  
  14. DELIMITER ;

Luego, desde tu cursor, llamas a esta funcion con un while, en plan

Código SQL:
Ver original
  1. SET id_hijo=dame_hijo(id_hijo);
  2. WHILE (id_hijo!=0) DO
  3. UPDATE tabla SET STATUS=0 WHERE id=id_hijo;
  4. SET id_hijo=dame_hijo(id_hijo);
  5. END WHILE;

Espero que te sirva
  #9 (permalink)  
Antiguo 01/10/2010, 07:51
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Cursor en mysql

Siiii claro que me sirvio, muchas gracias por tu ayuda meix!!! =)

Etiquetas: cursor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:17.