Ergebnis 1 bis 7 von 7

Thema: Insert und Select in Funktion

  1. #1
    _rr
    _rr ist offline Neuer Benutzer
    Registriert seit
    07.07.2010
    Beiträge
    9

    Standard 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:
    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);
    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?

  2. #2
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    794

    Standard

    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!

  3. #3
    _rr
    _rr ist offline Neuer Benutzer
    Registriert seit
    07.07.2010
    Beiträge
    9

    Standard

    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.

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von _rr Beitrag anzeigen
    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:
    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);
    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?
    works for me:

    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
    Übrigens auch mit dynamischen SQL:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    _rr
    _rr ist offline Neuer Benutzer
    Registriert seit
    07.07.2010
    Beiträge
    9

    Standard

    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.

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von _rr Beitrag anzeigen
    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.
    Klingt so, als ob Dir die Funktion currval() unbekannt sei ...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    _rr
    _rr ist offline Neuer Benutzer
    Registriert seit
    07.07.2010
    Beiträge
    9

    Standard

    die werde ich mir mal angucken, danke erstmal

Ähnliche Themen

  1. Funktion in INSERT-Regel und RETURNING
    Von bb1898 im Forum Trigger und Funktionen
    Antworten: 1
    Letzter Beitrag: 11.07.2010, 11:46
  2. Problem insert into ... select - performanceprobleme.
    Von Nico im Forum SQL
    Antworten: 6
    Letzter Beitrag: 08.01.2010, 12:09
  3. Insert/Update und Select
    Von Hahne im Forum SQL
    Antworten: 3
    Letzter Beitrag: 29.01.2008, 18:28
  4. Antworten: 20
    Letzter Beitrag: 29.12.2007, 09:35
  5. Funktion mit SELECT und Variablen
    Von Hahne im Forum Trigger und Funktionen
    Antworten: 1
    Letzter Beitrag: 30.09.2007, 14:51

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum