Hallo,
ich habe eine Funktion die Werte in eine Tabelle einschreibt. So weit nichts besonderes, nur werden dabei Werte aus dieser Tabelle mit benutzt und ausgelesen. Das Problem ist nun aber, dass ich Werte lesen will (um diese anschließend wieder einzutragen) die eben erst ein paar Loops vorher eingefügt worden sind. Leider findet die Funktion dann diese Werte nicht.
Beispiel:
id |a |b |c
1 a1 b2 c3
insert (id,a,b,c) values (2,a2,b3,c4);
insert (id,a,b,c) values (3,(select a from TABLE where id=2),b4,c5);
Diese Inserts werden in der Funktion dynamisch erstellt und ausgeführt. Und leider kennt der zweite Insert den ersten noch nicht.
Gibt es dafür eine Lösung?
einen commit lässt sich in plpgsql-Funktionen nicht auslösen. Das Zwischenspeichern geht leider nicht, da anders als im oberen Beispiel unterschiedliche Werte aus dem Loop abgefragt werden können, ich weiß vorher nicht welcher Wert nötig ist. Ich dachte eher es lässt sich diese temporäre Zwischenspeicherung der aktualisierten Tabelle abfragen, die ja noch nicht fest in die Tabelle geschrieben ist, sondern Postgres sich ja vormerkt zu schreiben.
test=# create table rr(a int, b int);
CREATE TABLE
Zeit: 1,410 ms
test=*# create or replace function f_rr() returns int as $$begin insert into rr values (1,10); insert into rr select 2, 20*b from rr where a=1; return 1; end; $$ language plpgsql;
CREATE FUNCTION
Zeit: 0,575 ms
test=*# select * from f_rr();
f_rr
------
1
(1 Zeile)
Zeit: 0,708 ms
test=*# select * from rr;
a | b
---+-----
1 | 10
2 | 200
(2 Zeilen)
Zeit: 0,213 ms
Übrigens auch mit dynamischen SQL:
test=*# create or replace function f_rr() returns int as $$begin execute 'insert into rr values (1,10);'; execute 'insert into rr select 2, 20*b from rr where a=1;'; return 1; end; $$ language plpgsql;
CREATE FUNCTION
Zeit: 0,430 ms
test=*# select * from rr;
a | b
---+---
(0 Zeilen)
Zeit: 0,237 ms
test=*# select * from f_rr();
f_rr
------
1
(1 Zeile)
Zeit: 0,651 ms
test=*# select * from rr;
a | b
---+-----
1 | 10
2 | 200
(2 Zeilen)
Zeit: 0,204 ms
test=*#
danke für die antwort. leider funktioniert das bei mir nicht. in deinen funktionen greifst du auf einen bekannten wert zurück(a=1) und führst darauf eine berechnung aus. ich habe jedoch das problem, dass ich auf den bigserial zu greife, der zu diesem zeitpunkt noch nicht eingefügt wurde.ein insert innerhalb einer funktion (aufgerufen durch eine weitere funktion) erstellt einen neuen datensatz samt primärschlüssel(bigserial). auf diesen wird beim zweiten druchlauf der funktionen zugegriffen, beim insert jedoch kommt die meldung , er scheint also den zuvor eingefügten datensatz nicht in die berechnung mit einzubeziehen.