Temp tables don't interact well with plpgsql's attempts to cache query
plans for the queries in its functions. This is a bug, but a solution
is not close at hand.
In 7.1, you can work around this by using EXECUTE to execute the queries
on the temp table, thus forcing a re-plan on every execution. Ugly but
serviceable.
Another possibility is to create the temp table only once per session,
outside the function itself. The function can just DELETE FROM the
table to clear it for re-use on each call.
regards, tom lane