Re: functions and temporary tables
От | Jan Poslusny |
---|---|
Тема | Re: functions and temporary tables |
Дата | |
Msg-id | 402794C2.6000007@gingerall.cz обсуждение исходный текст |
Ответ на | functions and temporary tables ("anorakgirl" <postgres@anorakgirl.co.uk>) |
Список | pgsql-general |
Hi, when I solved a very similar problem and I finally left idea about temporary tables and I used something as following: - create some permanent table(s) to store connection-specific informations with added column 'pid' (which is primary key). - when you insert some row into this table, use pg_backend_pid() as primary key - when you select propper row, use clause 'where pid = pg_backend_pid()' - be carefull about "dead" rows (it's pid does not correspond with existing pg backend yet) regards, pajout anorakgirl wrote: >hi, > >i'm writing some plpgsql functions which use a temporary table, and i've >read the FAQ and am using EXECUTE to create and insert into my table to >avoid errors caused by postgres caching the query plan. however, i can't >work out how to get the data back out of my temporary table, as i don't >think i can get the results of a select performed using EXECUTE? if i just >do the select directly, once the temporary table has been recreated, the >select fails with the error "relation with OID xxxxx does not exist". Can >anyone suggest how I can void this and get data back out of my temp table? > >I've pasted the functions at the end of the mail if it helps. >Thanks, >Tamsin > >CREATE OR REPLACE FUNCTION setAppUser (TEXT) RETURNS BOOLEAN AS ' > DECLARE > uname alias for $1; > > BEGIN > IF isTable(''app_user'') THEN > EXECUTE ''DELETE FROM app_user''; > ELSE > EXECUTE ''CREATE TEMPORARY TABLE app_user (username VARCHAR(50)) ON >COMMIT DROP''; > END IF; > EXECUTE ''INSERT INTO app_user VALUES (''''''||uname||'''''')''; > > RETURN TRUE; > END; > ' LANGUAGE 'plpgsql'; > > --RETURNS THE APP USERNAME IF THERE IS ONE > CREATE OR REPLACE FUNCTION getAppUser () RETURNS VARCHAR AS ' > DECLARE > user_record RECORD; > > BEGIN > IF isTable(''app_user'') THEN > SELECT INTO user_record * FROM app_user; > IF NOT FOUND THEN > RETURN ''''; > ELSE > RETURN user_record.username; > END IF; > ELSE > RETURN ''''; > END IF; > END; > ' LANGUAGE 'plpgsql'; > > > > >---------------------------(end of broadcast)--------------------------- >TIP 4: Don't 'kill -9' the postmaster > > >
В списке pgsql-general по дате отправления: