Postgres在函数中回滚

时间:2017-03-11 17:27:41

标签: postgresql stored-procedures

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

0 个答案:

没有答案