Re: Temporary Tables - Mailing list pgsql-general

From
Subject Re: Temporary Tables
Date
Msg-id 200503312203.j2VM3dlh028915@mail10.atl.registeredsite.com
Whole thread Raw
In response to Temporary Tables  ("Joseph M. Day" <jday@gisolutions.us>)
List pgsql-general
Create your temp tables like this:

CREATE TEMP TABLE mytest
(

)WITHOUT OIDS ON COMMIT DELETE ROWS

PG holds onto the temp table for the duration of the connection, when the connection ends all temp tables are dropped.
Thismeans you can simply reuse the same tables for the duration of the connection. 

In my functions before I create the temp table I check to see if it exists with function below, if the table already
existsI don't try and create it. 
You can also run into issues where you have to do your SQL in execute statements so it can use the proper OID for the
temptable.  We have been using this method with temp tables and it works great. 


(author unknown)

CREATE or REPLACE FUNCTION public.iftableexists( varchar)
RETURNS pg_catalog.bool AS
$BODY$
DECLARE

 BEGIN

     /* check the table exist in database and is visible*/
 perform n.nspname ,c.relname
FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid
= c.relnamespace
where n.nspname like 'pg_temp_%' AND pg_catalog.pg_table_is_visible(c.oid)
AND Upper(relname) = Upper($1);

     IF FOUND THEN
        RETURN TRUE;
     ELSE
        RETURN FALSE;
     END IF;

 END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE


>
> From: "Joseph M. Day" <jday@gisolutions.us>
> Date: 2005/03/31 Thu AM 10:49:37 EST
> To: <pgsql-general@postgresql.org>
> Subject: [GENERAL] Temporary Tables
>
> I am having some problems understanding how the temp tables work in PG.
> I have a relatively lengthy function I am creating that makes frequent
> use of temporary tables.
>
> I am dropping and recreating the temp tables on each run. If I run the
> procedure the first time via psql it seems to run fine. If I try to
> immediately run it again I get the following message:
>
> Error: relation with OID 22938 does not exist
>
> The query it is running is the following:
>
> Select Into sTableName TableName From tmp_tblJoin Where ID = 1;
>
> Nothing special about it other than "tmp_tblJoin" is defined as a
> temporary table.
>
> I do understand what is happening (I think). There is a stale pointer to
> the previous instance of the temp table (that no longer exists) which is
> causing the function to blow up. My question is how to I stop it from
> storing the OID of the old reference.
>
> I am relatively new to PG, but have years of experience with MSSQL and
> never had to deal with these type of issues. I am using plpqsql and
> explicitly setting it to volatile.
>
> Any help may save the last couple strands of hair on my head :-)
>
> Joe,
>
>
> --------------------------------------------
> Joseph M. Day
> Global Innovative Solutions
>
>
>
>


pgsql-general by date:

Previous
From: Philip Hallstrom
Date:
Subject: Re: Database monitor (again)
Next
From: Nic Ferrier
Date:
Subject: Re: Database monitor (again)