Ver Mensaje Individual
  #4 (permalink)  
Antiguo 02/03/2011, 05:59
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

Cita:
¿Cómo capturo los errores? Pon un ejemplo, por favor.
La captura de errores se hace por programación, por lo que dependerá del lenguaje usado para la aplicación que vayas a diseñar.

En el caso de los SP, la ejecución misma del SP debe devolver un error, que suelen aparecer como mensajes en la misma interfase que usas para las pruebas (phpMyAdmin, en tu caso, yo prefiero usar MySQL Workbench). COmo los SP no son debuggeables en MySQL, la única forma de obtener los errores es con HANDLERs, controlando los diferentes SQLSTATE, pero puede volverse muy engorroso.

Respecto de los cursores, estos son grandes consumidores de procesador y tiempo, por lo que son recomendables si y sólo si debes forzosamente verificar o realizar operaciones con un conjunto dado de datos en cada registro. Usarlos para localizar un conjunto de registros que cumplen una condición, pero no para operar con los datos, a mi entender no es una buena práctica.

Mi recomendación es que si quieres obtener un conjunto de registros que luego serán borrados, es más simple y rápido hacerlo con tablas temporales. Además, las tablas temporales se borran solas al cerrar la conexión, por lo que no molestan.

Así pues, hay dos propuestas: Una es la que ya te hice:
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(CURDATE(), INTERVAL 7 DAY) AND estado IN(0,2);
  8. END$$
La otra sería con tablas temporales:
Código MySQL:
Ver original
  1. DELIMITER$$
  2. DROP PROCEDURE IF EXISTS eliminaPrensaExterna()$$
  3. CREATE PROCEDURE eliminaPrensaExterna()
  4.     DROP TEMPORARY TABLE IF EXISTS t_prensa_externa t_prensa_externa ;
  5.     CREATE TEMPORARY TABLE t_prensa_externa LIKE prensa_externa;
  6.     INSERT INTO t_prensa_externa
  7.     SELECT *
  8.     FROM prensa_externa
  9.     WHERE fchPublicacion = SUB_DATE(CURDATE(), INTERVAL 7 DAY) AND estado IN(0,2);
  10.     DELETE FROM prensa_externa
  11.     WHERE id_prensa_externa IN (SELECT id_prensa_externa  FROM t_prensa_externa);
  12.     SELECT *
  13.     FROM t_prensa_externa;
  14. END$$
Este SP devuelve como salida una tabla conteniendo los registros que fueron borrados de la tabla. Desaparecerá cuando la conexión del usuario se cierre.

Postdata: Los códigos que te había puesto antes tenían algunos errores de sintaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)