real
je ztrátový, nepřesný typ s plovoucí desetinnou čárkou. Pro ukládání používá pouze 4 bajty a nemůže pro začátek přesně uložit prezentované číselné literály. Podrobnosti implementace navíc závisí na vaší platformě. Zvažte kapitolu „Typy s plovoucí desetinnou čárkou“ v manuál.
Ani s round()
není nic špatného nebo cast()
. Pro přesné výsledky byste museli použít numeric
pro začátek.
Audit funkcí
CREATE OR REPLACE FUNCTION test3()
RETURNS void AS
$func$
DECLARE
r record;
BEGIN
FOR r IN
SELECT abs_km AS km
,cast(abs_km AS numeric) AS km_cast
,round(abs_km::numeric, 2) AS km_round
FROM gps_entry
LOOP
RAISE NOTICE 'km: % , km_cast: % , km_round: %'
, r.km, r.km_cast, r.km_round;
INSERT INTO test (km, casting, rounding)
VALUES (r.km, r.km_cast, r.km_round);
END LOOP;
END
$func$ LANGUAGE plpgsql;
- Neuvádějte název jazyka
plpgsql
. Je to identifikátor. -
Nemá smysl zaokrouhlovat na 2 desetinné číslice po casting do
numeric(16,2)
, která už násilně zaokrouhluje. Buď - nebo ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Nakonec je potřeba upgradovat na aktuální verzi. Postgres 8.3 dosáhl EOL a není podporován.