Re: temporäre Tabelle

From: ralf burger <ralf(at)erste(dot)de>
To: Andreas Kretschmer <andreas_kretschmer(at)despammed(dot)com>
Cc: PostgreSQL User List <pgusers(at)postgres(dot)de>, PgSQL-Allgemein <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Re: temporäre Tabelle
Date: 2004-11-14 08:31:27
Message-ID: Pine.LNX.4.10.10411140918590.20813-100000@os.erste.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

hallo andreas,

> innerhalb einer Funktion benötige ich temporär eine Tabelle. Gibt es
> einen sicheren Weg, dafür einen passenden Tabellenmamen zu generieren,
> ohne das es z.B. zwischen 2 Sessions zu Kollisionen kommt?
> Nach beenden der Funktion brauche ich die Tabelle nicht mehr, ist nur
> ein Zwischenspeicher. Ideal wäre es, daß auch bei einem
> unvorhergesehenem Ende der Funktion die Tabelle weg ist.
>
> Oder wie handelt man sowas richtig?

ich hatte ein aehnliches problem und bin folgendermassen vorgegangen:
(dabei setze ich voraus, dass dein problem ebenfalls nicht mit temp-tables
zu loesen ist, dass du die tabellen auch nach trennung des DB-connects
noch benoetigst)
(in meinem fall ging es um das blaettern in gefundenen datensaetzen einer
suche - auch nachdem man den DB-connect beendet hat)

ich erzeuge einen pool von tabellen, die dem jeweiligen user zugeordnet
werden koennen:
List of relations
Schema | Name | Type | Owner
--------+------------------------------+----------+----------
public | temp10 | table | natart
public | temp11 | table | natart
public | temp12 | table | natart
public | temp13 | table | natart
public | temp14 | table | natart
public | temp15 | table | natart
public | temp16 | table | natart
public | temp17 | table | natart
usw..

zur verwaltung dieser tabellen lege ich eine weitere tabelle an:

create table temp_tables (
table_number integer default 0,
table_owner varchar default '',
table_mandant varchar default '',
table_query varchar default '',
table_target varchar default '',
stamp timestamp default now()
);

mit der funktion temptable(username) wird nun aus pool der
temporaertabellen die am laengsten nicht verwendete tabelle
herausgesucht und geloescht (oder nue angelegt) und dem user
zurueckgeliefert:

create or replace function temptable(varchar) RETURNS integer AS '
DECLARE
rec RECORD;tc integer;username alias for $1;
ret text; tabname varchar;
BEGIN
select count(oid) as counter from temp_tables into rec;
tc=rec.counter+1;
if tc>99 then
select table_number from temp_tables into rec order by stamp limit 1;
tc=rec.table_number;
end if;
tabname=''temp''||tc;
select tablename from pg_tables into rec where tablename=tabname;
IF NOT FOUND THEN -- noe, nich da. dann anlegen.
execute(''create table ''||tabname||''(ext_oid oid)'');
insert into temp_tables values(tc,aktman(username),username);
END IF;
update temp_tables set
table_owner=username,table_mandant=aktman(username),stamp=now()
where table_number=tc;
execute(''delete from ''||tabname);
RETURN tc;
END;
' LANGUAGE plpgsql immutable;

comment on function temptable(username) is 'erzeugt oder leert eine
temporaere Tabelle zum Zweck der scrollbaren Anzeige. Die Tabellen haben
die Namen "temp[nr]" und speichern die oids von gefundenen Datensaetzen.
Die Funktion liefert die Nummer der aktuellen Tabelle zurueck.';

viele gruesse

ralf

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Kretschmer Andreas 2004-11-14 08:48:45 Re: temporäre Tabelle
Previous Message Italcom PostgreSQL Development 2004-11-14 02:20:54 kompilieren mit 64bit