[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2001
    Beiträge
    832

    RRN von DDS Tabelle nach Insert

    Hallo zusammen,

    mal eine Frage an die SQL Profis

    in eine DDS definierte Tabelle wird ein Satz eingefügt
    PHP-Code:
     insert into aTabHist
                select 
    from Tab
                where   
    ......... 

    Die Tabelle aTabHist hat keinen Unique Key.
    Gibt es die Möglichkeit die eingefügte RRN des neuen Satzes zu ermitteln ?

    Gruß
    Michael

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Es gäbe zwar die Möglichkeit das Ergebnis des INSERTs in ein SELECT zu packen ...
    Code:
    SELECT RRN(Tab1), Tab.* FROM FINAL TABLE (INSERT INTO TAB1 VALUES (...)) Tab1
    allerdings erhalte ich hier immer nur den Wert 1.

    Ich würde vorschlagen, ein hidden Feld hinzuzufügen, welches vom System automatisch hochgezählt wird.
    Dadurch kannst du dir dann die ID mit der SQL Funktion IDENTITY_VAL_LOCAL () ermitteln.

    Nachtrag: Hidden halt dann, wenn aus irgendwelchen gründen keine neue Spalte hinzugefügt werden darf.

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    832
    HI,

    wir können das Thema schliessen. Ich abe es auf die knvetionelle Art gelöst.
    Danke für die Info's

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    RRN ist für SQL-Anwendungen die denkbar schlechteste Wahl.
    Identity-Columns sind da allemal besser (früher auch mit Sequence).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Auch beim Zugriff über Relative Satz-Nr. mit SQL hat sich einiges geändert.
    Seit Release 7.1 wird an dieser Stelle kein Table Scan ausgeführt, sondern der Zugriff erfolgt über einer sog. Values or RRN List.

    Wenn man natürlich die Wahl hat und auf alle Fälle bei neuen (SQL) Tabellen (nicht DDS physicsche Dateien), sollte man grundsätzlich einen künstlichen eindeutigen Schlüssel integrieren und über diesen zugreifen bzw. diesen auch zum Verknüpfen mit abhängigen Tabellen verwenden.

    Birgitta

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    SELECT RRN(Tab1), Tab.* FROM FINAL TABLE (INSERT INTO TAB1 VALUES (...)) Tab1
    erklärt sich eigentlich von selbst, da ja die Final Table eine "temporäre" Tabelle ist und nicht auf die Zieltabelle verweist sondern auf das Ergebnis des Inserts.
    Der Zugriff per RRN ist zwar inzwischen schnell, aber die RRN ist keine zuverässige Zugriffs-Id, insbesonders nicht zum Speichern in einer 2. Tabelle geeignt. So (eigentlich nicht mehr benötigte) Funktionen wie RGZPFM organisieren das nämlich neu.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Sep 2008
    Beiträge
    70

    Question

    In dem Zusammenhang INSERT u. FINAL TABLE eine Frage, ob unter V7R1 das mit Update bzw. Delete funktioniert?
    Mein Test hat ergeben, dass es scheinbar nur bei INSERT mit FINAL TABLE bzw. NEW TABLE funktioniert. Lieg ich dabei richtig?

    Code:
    -- Insert (mehrere Zeilen + Rückgabe)
    SELECT * FROM FINAL TABLE(
     INSERT INTO kunden VALUES (DEFAULT, 'M44', 'MÜLLER', 'M', 'Herr', DEFAULT, DEFAULT, DEFAULT),
          (DEFAULT, 'M45', 'MEYER', 'M', 'Herr', DEFAULT, DEFAULT, DEFAULT)
    )
    ORDER BY INPUT SEQUENCE;
    
    -- UPDATE (m. V7R1 n. unterstützt)
    SELECT * FROM OLD TABLE(
     UPDATE kunden SET NAME = 'MICHAEL' WHERE IDKD=36
    );
    
    -- DELETE, gelöschte Sätze anzeigen (m. V7R1 n. unterstützt)
    SELECT * FROM OLD TABLE(
     DELETE FROM kunden WHERE IDKD = 34)
    );
    Mfg

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    FINAL TABLE ist nur für Insert zulässig

    Hier ein Auszug aus der SQL Referenz:
    FINAL TABLE
    Specifies that the rows of the intermediate result table represent the set of rows
    that are inserted by the SQL data change statement as they appear at the
    completion of the data change statement. If there are AFTER INSERT triggers
    or referential constraints that result in further changes to the inserted rows of
    the table that is the target of the data change statement, an error is returned
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Da du sowohl für Update als auch Delete die Daten doch kennen musst, macht die FINAL TABLE hier überhaupt keinen Sinn.
    Was soll denn die FINAL TABLE z.B. beim Delete liefern, da die Daten dann doch weg sind?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Sep 2008
    Beiträge
    70

    Exclamation

    Freilich, deswegen hatte ich ja noch ein konkretes Beispiel mit DELETE sowie eines mit UPDATE (s.o.) aufgelistet:

    Code:
    SELECT * FROM OLD TABLE(
     DELETE FROM kunden WHERE IDKD = 34)
    Meine Frage war eher dahingehend, ob OLD Table unterstützt wird oder ob das wieder nur ein Feature für die "richtige" DB2 oder zOs etc. ist?

    Beispiel hier z.B.: http://it.toolbox.com/blogs/db2luw/s...statement-7239

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Schau in die Doku des SQL (V7R3). Hier findest du NEW/FINAL TABLE nur beim Insert.
    OLD TABLE findest du nur bei SQL-Triggerdefinitionen.
    M.a.W: OLD TABLE beim Update/Delete ist nicht realisiert.
    Vielleicht wirds ja irgendwann mit TRx/V8R1...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Sep 2008
    Beiträge
    70
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Schau in die Doku des SQL (V7R3). Hier findest du NEW/FINAL TABLE nur beim Insert.
    Hatte ich gemacht, hoffte aber darauf, dass ich mich nur versehen habe und es doch möglich ist. Leider aber nicht.
    Danke für die zwei schnellen Auskünfte!

Similar Threads

  1. insert 32768
    By Armin in forum NEWSboard Programmierung
    Antworten: 17
    Letzter Beitrag: 19-12-14, 13:07
  2. SQL V5R4 Insert into
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 10-10-14, 09:13
  3. SQL: Sortierung individuell nach einer Werte-Tabelle
    By bie-dro in forum NEWSboard Programmierung
    Antworten: 18
    Letzter Beitrag: 08-09-14, 21:26
  4. Tabelle aus QSYS.LIB nach QDLS kopieren
    By TARASIK in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 26-03-03, 11:03
  5. SQL insert mit variable
    By Robi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 21-03-03, 10:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •