Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/03/2011, 05:17
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Procedimientos almacenados mysql

Los procedimientos almacenados se implementaron precisamente para la versión 5.0.x, por lo que tu problema no está allí: está en el código que tiene un defecto básico: No puedes leer y borrar en la misma tabla al mismo tiempo...

Me explico: Un CURSOR abre una tabla en modo de lectura exclusivo, por lo que automáticamente está bloqueada para toda otra acción, excepto dirty reads. Este bloqueo dura mientras el CURSOR esté abierto, porque en realidad estás recorriendo los registros uno a uno.
Como la tabla está bloqueada, simplemente no puedes borrar un registro en base a una lectura de la misma tabla, y menos aún el registro sobre el que en ese momento estás parado. Sería igual que cortar la rama del árbol en la que te estás sosteniendo...
Tu segundo problema es que esta acción debería estar devolviendo un error de ejecución, que tu no estás capturando. Es de buena programación capturar todos los mensajes de error que se producen, especialmente en la etapa de desarrollo.

Además de estas consideraciones, ese procedimiento podría ser más simple, y no estás usando en algunos casos las sentencias correctas para las acciones a realizar.
Por lo pronto, ten en cuenta que el borrado de los registros tiene una condición bastante simple: estado debe ser 0 ó 2 y la fecha de publicación, la de hace siete días. Las dos cosas tiene forma simples de escribirse, y para las fechas es siempre mejor usar funciones que hacer operaciones aritméticas.
Eso sería simplemente:
Código MySQL:
Ver original
  1. DELETE FROM prensa_externa
  2. WHERE fchPublicacion = SUB_DATE(CURDATE(), INTERVAL 7 DAY) AND estado IN(0,2);

o bien:
Código MySQL:
Ver original
  1. DELETE FROM prensa_externa
  2. WHERE ADD_DATE(fchPublicacion, INTERVAL 7 DAY) = CURDATE() AND estado IN(0,2);

Si lo quieres en un SP:
Código MySQL:
Ver original
  1. DELIMITER$$
  2. DROP PROCEDURE IF EXISTS eliminaPrensaExterna()$$
  3. CREATE PROCEDURE eliminaPrensaExterna()
  4.     DECLARE fechaActual DATE;
  5.     SET = fechaActual = CURDATE();
  6.     DELETE FROM prensa_externa
  7.     WHERE fchPublicacion = SUB_DATE(fechaActual, INTERVAL 7 DAY) AND estado IN(0,2);
  8. END$$

Toma nota de que para asignar valores a las variables no necsitas usar SELECT INTO, sino SET. SELECT INTO se usa fundamentalmente si los valores provienen de un SELECT,, pero no si son producto de funciones u operaciones con datos ya existentes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/03/2011 a las 06:00