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 originalDELIMITER $$
-- iniciamos el Procedimiento
-- insertamos la cabecera del presupuesto
-- recuperamos el idPresupuesto generado
-- capturamos los datos de la tabla temporal
idPresupuesto,
idCliente,
Referencia,
Detalle,
IVA,
PrecioUnitario,
Cantidad)
idPresupuesto,
idCliente,
Referencia,
Detalle,
IVA,
PrecioUnitario,
Cantidad
-- se vacía la tabla temporal
$$
DELIMITER;
Si los valores de subitem recibidos no vienen de la tabla origen, entonces hay que poner un TRIGGER similar a este:
Obviamente, este script hace referencia a un campo "SUBITEM" que debería existir, o llamarse de otra forma.