Insert und Select in Funktion

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?

Entweder du schickst ein Commit nach dem ersten Insert oder du speicherst die Werte in entsprechenden Variablen zwischen.

Gruß Uwe

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.

works for me:

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=*#

Andreas

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.

Klingt so, als ob Dir die Funktion currval() unbekannt sei …

Andreas

die werde ich mir mal angucken, danke erstmal