Función un poco mas estable.
Código sql:
Ver originalCREATE OR REPLACE FUNCTION pa_grabardetalle(_codcab bpchar, _codigo bpchar[], _aimporte NUMERIC[][])
RETURNS FLOAT AS
$BODY$
BEGIN
FOR i IN array_lower(_aimporte,1) .. array_upper(_aimporte,1) LOOP
INSERT INTO detalle(codcab,codigo,importe1,importe2)
VALUES(_codcab,_codigo[i],round(_aimporte[i][1]::NUMERIC,2),round(_aimporte[i][2]::NUMERIC,2));
END LOOP;
IF (SELECT round((SUM(importe1)-SUM(importe2))::NUMERIC,2) FROM detalle WHERE codcab=_codcab)::NUMERIC <> 0::NUMERIC THEN
--RAISE EXCEPTION 'las sumas no coinciden..!';
RETURN (SELECT SUM(importe1)-SUM(importe2) FROM detalle WHERE codcab=_codcab)::NUMERIC;
END IF;
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Sigo buscando. Todavía no me lo explico.
EDITO: OTRA MAS ESTABLE AUN, PERO FALLA DESPUES DE 10 INSERCIONES.
FALLA EN EL RETORNO DE LA FUNCIÓN, PERO TODAS LAS INSERCIONES SE HACEN CORRECTAMENTE
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION pa_grabardetalle(_codcab bpchar, _codigo bpchar[], _aimporte NUMERIC[][])
RETURNS NUMERIC AS
$BODY$
DECLARE
suma_1 record;
suma_2 record;
diferencia NUMERIC;
BEGIN
FOR i IN array_lower(_aimporte,1) .. array_upper(_aimporte,1) LOOP
INSERT INTO detalle(codcab,codigo,importe1,importe2)
VALUES(_codcab,_codigo[i],_aimporte[i][1],_aimporte[i][2]);
END LOOP;
SELECT INTO suma_1 SUM(importe1) AS suma1 FROM detalle WHERE codcab=_codcab;
SELECT INTO suma_2 SUM(importe2) AS suma2 FROM detalle WHERE codcab=_codcab;
diferencia := round(suma_1.suma1::NUMERIC,2)-round(suma_2.suma2::NUMERIC,2);
IF (diferencia <> 0.00) THEN
--RAISE EXCEPTION 'las sumas no coinciden..!';
RETURN diferencia;
END IF;
RETURN 99;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Estoy ofendido... Por que razón toma los valores con decimales escondidos?
Sigo buscando