I'm only learning this, but I've got a working function that I want to
be invoked in a trigger. The function itself is:
CREATE FUNCTION online_pct_func(integer, interval)
RETURNS boolean AS '
DECLARE
on numeric;off numeric;
o_pct numeric;
op varchar;
BEGIN
on := 0;off := 0;
SELECT count(info.online) INTO onFROM infoWHERE info.id = $1AND info.online = ''1''AND info.iso_date_time > (now() -
CAST($2AS interval));
SELECT count(info.online) INTO offFROM infoWHERE info.id = $1AND info.online = ''0''AND info.iso_date_time > (now() -
CAST($2AS interval));
o_pct := (on / (on + off)) * 100.0;
op := ''UPDATE online_pct '';
IF $2 = ''01:00'' THEN op := op || ''SET on1hr = '' || o_pct || '', isodt1hr = current_timestamp '';ELSIF $2 = ''1
day''THEN op := op || ''SET on1day = '' || o_pct || '', isodt1day = current_timestamp '';ELSIF $2 = ''1 week'' THEN op
:=op || ''SET on1wk = '' || o_pct || '', isodt1wk = current_timestamp '';ELSIF $2 = ''1 mon'' THEN op := op || ''SET
on1mo= '' || o_pct || '', isodt1mo = current_timestamp '';ELSIF $2 = ''1 year'' THEN op := op || ''SET on1yr = '' ||
o_pct|| '', isodt1yr = current_timestamp '';END IF;
op := op || ''WHERE id = '' || $1;
EXECUTE op;
RETURN 1;
END;
' LANGUAGE 'plpgsql';
It gives the intended outcome by itself, for example with select
online_pct_func(1, '1 year');
The trigger I've got, which is not working for me, is as follows:
CREATE FUNCTION online_pct_trig() RETURNS opaque AS '
DECLARE
i1hr timestamp;i1day timestamp;i1wk timestamp;i1mo timestamp;i1yr timestamp;
oper varchar;
BEGIN
SELECT o.isodt1hr INTO i1hr, o.isodt1day INTO i1day, o.isodt1wk INTO i1wk, o.isodt1mo INTO i1mo,
o.isodt1yrINTO i1yrFROM online_pct oWHERE o.id = NEW.id;
oper := ''SELECT online_pct_func(NEW.id, '';
IF i1hr <= (now() - ''00:01''::interval) THEN oper := oper || ''01:00'' || '');'';EXECUTE oper;END IF;IF i1day < (now()
-''01:00''::interval)THEN oper := oper || ''1 day'' || '');'';EXECUTE oper;END IF;IF i1wk < (now() = ''1
day''::interval)THENoper := oper || ''1 week'' || '');'';EXECUTE oper;END IF;IF i1mo < (now() - ''1
week''::interval)THENoper := oper || ''1 mon'' || '');'';EXECUTE oper;END IF;IF il1yr < (now() - ''1
mon''::interval)THENoper := oper || ''1 year'' || '');'';EXECUTE oper;END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER online_pct_trig
AFTER INSERT ON info
FOR EACH ROW EXECUTE PROCEDURE online_pct_trig();
I'm guessing there's an obvious error in there that I can't identify;
but I've gotten nowhere with it on my own. I guess I'm looking for any
input on this..
- Oeln