Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/02/2010, 05:20
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: 17 años
Puntos: 2658
Respuesta: Timeout al crear Procedimiento Almacenado en local

En mi opinión el SP está haciendo demasiadas tareas inutilmente.
Básicamente (y esta es la forma que manejo algunas con el mismo objetivo), esto se puede resolver con un SP que ejecuta tres sentencias y un trigger para poner los valores de subítem (eso si el valor no viene en la tabla temporal misma).
La sintaxis de este ejemplo recibe tres parámetros, devolviendo en el tercero un valor mayor a cero si se pudo realizar, o bien cero sino se pudo, ya que devuelve el LAST_INSERT_ID().
Nota: Estoy suponiendo, para este caso, que los campos de la tabla destino se llaman igual que en la tabla origen.
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE sp_insertarPresupuesto (IN idCliente INT, IN fechaAlta DATETIME, INOUT idPresupuesto INT)
  4.  
  5. -- iniciamos el Procedimiento
  6.  
  7.  
  8.     -- insertamos la cabecera del presupuesto
  9.     INSERT INTO LM_Presupuestos values ('',idCliente, FechaAlta);
  10.  
  11.     -- recuperamos el idPresupuesto generado
  12.     SET idPresupuesto = LAST_INSERT_ID();
  13.   IF idPresupuesto > 0 THEN
  14.     -- capturamos los datos de la tabla temporal
  15.     INSERT INTO LM_detallePresupuesto(
  16.       idPresupuesto,
  17.       idCliente,
  18.       Referencia,
  19.       Detalle,
  20.       IVA,
  21.       PrecioUnitario,
  22.       Cantidad)
  23.     SELECT
  24.       idPresupuesto,
  25.       idCliente,
  26.       Referencia,
  27.       Detalle,
  28.       IVA,
  29.       PrecioUnitario,
  30.       Cantidad
  31.     FROM LM_tmpPresupuestos;
  32.     -- se vacía la tabla temporal
  33.       TRUNCATE TABLE LM_tmpPresupuestos;
  34.     END IF;
  35.  
  36. $$
  37.  
  38. DELIMITER;

Si los valores de subitem recibidos no vienen de la tabla origen, entonces hay que poner un TRIGGER similar a este:
Código MySQL:
Ver original
  1. CREATE TRIGGER SET_SUBITEM_PRESUPUESTOS BEFORE INSERT
  2. ON  LM_detallePresupuesto
  3.         IF(SELECT MAX(SUBITEM) FROM  LM_detallePresupuesto WHERE idPresupuesto=NEW.idPresupuesto) IS NULL THEN
  4.       SET NEW.SUBITEM = 1;
  5.     ELSE
  6.       SET NEW.SUBITEM = (SELECT MAX(SUBITEM) FROM  LM_detallePresupuesto WHERE idPresupuesto=NEW.idPresupuesto) + 1;
  7.     END IF;
  8. END$$
  9.  
  10. DELIMITER ;
Obviamente, este script hace referencia a un campo "SUBITEM" que debería existir, o llamarse de otra forma.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)