CREATE OR REPLACE FUNCTION public.insert_art_mov(
IN _tipo character varying,
IN _documento integer,
IN _control integer,
IN _fecha_doc timestamp without time zone,
IN _corden integer,
IN _calmacen integer,
IN _donado integer,
IN _monto_desc numeric,
IN _observacion text,
IN _cart_generico integer[],
IN _cart_comercial integer[],
IN _cunidad integer[],
IN _cant numeric[],
IN _iva numeric[],
IN _costo numeric[],
IN _crea_user character varying,
OUT new_cmov integer)
RETURNS integer AS
$BODY$
DECLARE
MONTO_MOV numeric(11,2);
MONTO_TOT numeric(11,2);
BEGIN
--SUMO LOS VALORES DE CADA DETALLE PARA TENER EL VALOR GLOBAL DEL MOVIMIENTO
MONTO_MOV := (SELECT SUM(s) FROM UNNEST(_costo) s);
--RESTO EL MONTO DEL MOVIMIENTO Y DEL DESCUENTO (DE APLICAR) PARA TENER EL MONTO TOTAL
MONTO_TOT := MONTO_MOV - _monto_desc;
--INSERTO LA CABEZERA DEL MOVIMIENTO
INSERT INTO art_movimientos(tipo,fecha_mov,documento,control,fecha_doc,corden,calmacen,status,donado,monto_mov,monto_desc,monto_total,observacion,crea_user)
VALUES(_tipo,NOW(),_documento,_control,_fecha_doc,_corden,_calmacen,'PENDIENTE',_donado,MONTO_MOV,_monto_desc,MONTO_TOT,_observacion,_crea_user) RETURNING cmovimiento INTO new_cmov;
--INSERTO LOS DETALLES DEL MOVIMIENTO
INSERT INTO art_movimientos_det (cmovimiento,cart_generico,cart_comercial,cunidad,cant,iva,costo,crea_user)
SELECT new_cmov,UNNEST(_cart_generico),UNNEST(_cart_comercial),UNNEST(_cunidad),UNNEST(_cant),UNNEST(_iva),UNNEST(_costo),_crea_user;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
如何创建回滚或使用transaccions:https://www.postgresql.org/docs/current/static/tutorial-transactions.html以防止id(主键)的自动递增,例如,如果我执行错误的过程,表art_movimientos将自动增加ID