Ich habe eine Funktion die recht lange dauern kann, daher möchte ich die verweildauer in einer Tabelle eintragen.
So soeht der Code aus:
DECLARE
matview ALIAS FOR $1;
entry t_matviews%ROWTYPE;
dtnow TIMESTAMP;
BEGIN
dtNow = CURRENT_TIMESTAMP;
SELECT * INTO entry FROM t_matviews WHERE mv_name = matview;
IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;
EXECUTE 'DELETE FROM ' || matview;
EXECUTE 'INSERT INTO ' || matview
|| ' SELECT * FROM ' || entry.v_name;
UPDATE t_matviews SET last_refresh=CURRENT_TIMESTAMP, idauer=(CURRENT_TIMESTAMP - dtNow) WHERE mv_name=matview;
RETURN;
END
Scheinbar steht in der Variablen “CURRENT_TIMESTAMP” immer das selbe drin.
Denn obwohl die Funktion etwa 2 minuten benötigt steht in der Tabelle bei idauer = 00:00:00
test=# begin;
BEGIN
test=*# select now();
now
-------------------------------
2010-01-22 12:14:27.693285+01
(1 row)
test=*# select current_timestamp;
now
-------------------------------
2010-01-22 12:14:27.693285+01
(1 row)
test=*# select timeofday();
timeofday
-------------------------------------
Fri Jan 22 12:14:37.521412 2010 CET
(1 row)
test=*# select timeofday();
timeofday
-------------------------------------
Fri Jan 22 12:14:39.542168 2010 CET
(1 row)
test=*# select current_timestamp;
now
-------------------------------
2010-01-22 12:14:27.693285+01
(1 row)
Du siehst den Unterschied?
current_timestamp ist nix weiter als now(), welches den timestamp zu Begin der laufenden TX liefert. timeofday() hingegen liefert den wirklich wahren Zeitpunkt.