On Wed, 2006-09-20 at 16:51 -0400, Terry Lee Tucker wrote:
> Greetings:
>
> I have have a plpgsql function that creates a temporary table to facilitate
> some processing. Here is the code:
> CREATE TEMP TABLE tmp (code VARCHAR,
> booked INTEGER,
> avail INTEGER,
> covered INTEGER,
> profit NUMERIC (10,2),
> billed NUMERIC (10,2))
> WITHOUT OIDS ON COMMIT DROP;
>
> Note the "ON COMMIT DROP". I would expect this table to disapear after the
> function completes, but it does not. Also, if I execute the the function
In 8.1 it does drop for me on COMMIT, as you would expect. I don't know
about 7.4.
> twice in a row from the psql interface, on the second try, I get the
> following error:
> sev=# select * from custSprtRpt('04/01/06', current_date);
> NOTICE: custSprtRpt ()
> ERROR: relation with OID 123654 does not exist
> CONTEXT: PL/pgSQL function "custsprtrpt" line 39 at SQL statement
>
> If have to reload the function with \i sqlfunc/custSprtRpt.plsql so that it
> will work again. Why is this?
PL/pgSQL caches query plans. Unfortunately, there is currently no good
mechanism to invalidate the plans, and the function is using a stale
plan with an OID that no longer exists.
The workaround is to use "EXECUTE" in the function, and build the query
from a string. That prevents PL/pgSQL from caching the plan.
What confuses me is, if it didn't drop your table, why would it say the
oid doesn't exist?
Regards,
Jeff Davis