From: | "Peter Schmidt" <peterjs(at)home(dot)com> |
---|---|
To: | pgsql-sql(at)postgresql(dot)org |
Subject: | plpgsql function case statement |
Date: | 2001-09-12 15:46:34 |
Message-ID: | 9nnvu8$8hk$1@news.tht.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
I'm having trouble finding the best solution for the following plpgsql
function.
The function does the following:
- gets an integer from table1 (using function getHighMark)
- Updates info.lastused with the latest timestamp from usage_log where
info.id = usage_log.id, but only if the sequence number in usage_log is
greater than or equal to what was returned by getHighMark.
- if the timestamp value returned by the subselect is null, I want to set
info.lastused to an exisiting value from another timestamp column in
info(firstused).
Without the case statement the update inserts null into each row where
criteria was not met.
rows_updated is a placemarker for later postgres version...we're on 7.0.3
One alternative we had thought of was to create a view inside the function
(and destroy it) that is based on seq_number, but CREATE VIEW inside the
function seems to fail when it includes the variable "wm".
Here's what I came up with...but it's clearly not very efficient...
Can anyone help?
TIA
Peter
create function updateLastUsed(text, text)
returns integer
as
'
declare
wm integer;
rows_updated integer;
begin
rows_updated := 0;
wm := getHighmark($1,$2);
UPDATE info SET
lastused =
case when
(SELECT MAX(p.requesttime)
FROM usage_log p
WHERE p.id = info.id
AND p.seq_no >= wm)
= null
then firstused
else
(SELECT MAX(p.requesttime)
FROM usage_log p
WHERE p.id = info.id
AND p.seq_no >= wm)
end;
return rows_updated;
end;
'
language 'plpgsql';
From | Date | Subject | |
---|---|---|---|
Next Message | Josh Berkus | 2001-09-12 16:35:46 | Re: ERROR: Cannot insert a duplicate key into a unique index |
Previous Message | Peter Eisentraut | 2001-09-12 15:00:06 | Re: cache lookup failed |