Zeitdauer einer Funktionsausführung ermitteln

Servus,

Neues Board??? Sieht schick aus!!!

Hier meine Frage:

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

Wo liegt mein Fehler?



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.


Andreas

Das wars!
Dankeschön