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
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 |