Thread: plpgsql function case statement
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 (SELECTMAX(p.requesttime) FROM usage_log p WHERE p.id = info.id AND p.seq_no >= wm) = null thenfirstused 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';
Peter Schmidt wrote: >I'm having trouble finding the best solution for the following plpgsql >function. >The function does the following: Hi, I post in this mailing list for the first time. :-) I think your pl/pgsql function runs properly, but there is likely to exist another SQL pattern. In this case, estimation of whether the TIMESTAMP value or NULL is finished at one time. Please try it, if you have time for checking. (on v7.1.3) 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 = (SELECT case when MAX(p.requesttime) is null then info.firstused else MAX(p.requesttime) end FROM usage_log p WHERE p.id = info.id AND p.seq_no >= wm ) -------------------------------------------------------------- return rows_updated; end; ' language 'plpgsql'; -------------------- M.Sugawara rk73@echna.ne.jp