ich erstelle in einer Funktion eine temp tabelle (on commit drop), in welcher ich Daten sammle, bearbeite usw.
Beim ersten Aufruf der Funktion (in einer Session) funktioniert alles wie erwartet, bei den folgenden erhalte ich die Fehlermeldung:
“Relation mit OID yxz existiert nicht”
Hallo Andreas, zunächst vielen Dank.
Ich habe Dein Beispiel getestet. Allerdings verwendest Du dynamisches SQL nicht nur für DDL sondern auch für DML.
Folgende kleine Änderung funktioniert schon wieder nicht mehr:
create or replace function ttable(int) returns int as
$$
declare sql text;ret int;
begin
sql:=‘create temporary table ttable(i int)’;
execute sql;
insert into ttable values($1);
select 5*i into ret from ttable;
sql:=‘drop table ttable;’;
execute sql;
return ret;
end;
$$ language plpgsql;
Nun ist das hier ein triviales Beispiel. Die Funktionen, welche ich portieren muß sind teilweise sehr komplex, auch werden ggf. mehrere temp Tabellen erzeugt, gejoint usw. Und dann für jeden Schritt sql:= … execute, das macht mich nicht so richtig glücklich. Gibt es denn keine andere Möglichkeit?
Eigentlich müßte es doch reichen, der Funktion irgendwie beizubringen, dass sie den alten Plan nicht verwenden soll. Denn offensichtlich besteht ja genau darin das Problem oder?
Oder gibt es vielleicht noch andere Wege, wie man das tun kann?