Entweder du schickst ein Commit nach dem ersten Insert oder du speicherst die Werte in entsprechenden Variablen zwischen.
Gruß Uwe
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:
Diese Inserts werden in der Funktion dynamisch erstellt und ausgeführt. Und leider kennt der zweite Insert den ersten noch nicht.Code: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);
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
Have a lot of fun!
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:
Übrigens auch mit dynamischen SQL:Code: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
AndreasCode: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=*#
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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 <NULL>, er scheint also den zuvor eingefügten datensatz nicht in die berechnung mit einzubeziehen.
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
die werde ich mir mal angucken, danke erstmal
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen