[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2012
    Beiträge
    10

    COBOL SQL INSERT Satznummer des Inserts

    Hallo,
    im COBOL Programm mit embedded SQL mache ich einen INSERT.
    Wenn dieser Insert erfolgreich war benötige ich die Satznummer (RRN(A)) des eingefügten Satzes (am besten als Returnvalue).
    Ein nachfolgender SELECT MAX... oder SELECT mit den Werten des INSERTs ist nicht eindeutig genug (das liegt an der Anwendung).
    Vielen Dank

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dies ist leider per SQL nicht möglich.
    Die Funktion RRN(A) ist ein "kalkuliertes" Ergebnis in SQL auch wenn sich diese RRN außer bei einem RGZPFM ja nie ändert.
    Hier hilft wirklich nur eine Identity-Spalte.
    Wenn die Tabelle keinen eindeutigen Schlüssel hat, kommst du an diesen Satz nicht mehr dran, schließlich können ja 2 Programme gleichzeitig einen Insert machen.
    Und bei einem REUSEDLT(*YES) liefert MAX(RRN(A)) auch nicht den korrekten Wert.

    Mittels
    select ... from final table (insert into myfile ...)
    kann man Feldinhalte die durch Trigger/Defaults gefüllt werden dann wieder auslesen.

    Wozu brauchst du die Information denn, wenn du einen Insert machst?
    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

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dies ist leider per SQL nicht möglich.
    ... zum Glück! Zum Glück, das ist doch kein Datenschrank-System.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Sofern man das richtige Release hat und SELECT ... FROM FINAL TABLE absetzen kann, kommt man auch an die entsprechenden relativen Satz-Nr. der eingefügten Sätze.

    Code:
    Select rrn(a), Fld1, Fldx, Fldy, ...
       from Final Table(Insert Into YourTable
                           Select ....
                             From ....
                             Where ....) x
    Order By Input Sequence;
    Das SELECT-statement (mit samt dem Insert) kann man im DECLARE CURSOR hinterlegen und sich dann durch die einzelnen Sätze loopen.

    Das ganze geht natürlich auch bei einem Insert ohne SELECT, also nur über VALUES und aufgelistete Feld-Inhalte.

    Ach ja und übrigens, was kaum einer weiß, seit Release 7.1 können auch Indices über die relative Satz-Nr. gebildet werden, was den Zugriff über die relative Satz-Nr. um einiges beschleunigt.

    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

  5. #5
    Registriert seit
    Dec 2012
    Beiträge
    10
    Hallo Alle zusammen,
    vielen Dank für die Tipps.
    Hier noch einige Erklärungen zu Euren Anmerkungen (speziell BenderD):
    - Final Table geht leider nicht, da wir gezwungen sind unter V6 zu arbeiten (seufz)
    - Einen eindeutigen Satzschlüssel des gerade eingefügten Satzes benötigt man sehr wohl, wenn nach dem Insert eine weitere Funktion sich genau diesem Satz widmen soll, die Schlüsselkomponenten jedoch VOR dem Insert nicht eindeutig sein können (z.B. Timestamp, weshalb ich nach dem INSERT keinen sicheren Select absetzen kann, denn dann müsste ich ja den Timstamp der erzeugt wird vorher wissen) UND die Tabelle von mehreren Programmen asynchron beschrieben werden. In diesem Fall ist es eine Schnittstelle die sowohl von einem Externen System als auch von der I5 beschrieben wird. Schnittstellen werden ein immer größeres Thema.
    Gruß
    HEG

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von heg Beitrag anzeigen
    - Einen eindeutigen Satzschlüssel des gerade eingefügten Satzes benötigt man sehr wohl, wenn
    HEG
    Da bin ich (fast) Deiner Meinung: einen eindeutigen Schlüssel braucht man ohne wenn und aber!!!

    ... genau dafür sind sogenannte Kunstkeys gut (BTW Timestamps taugen nicht als eindeutiger Key, auch nicht in Kombination mit anderen Feldern). Das geht auch in Verbindung mit Identity columns und der Function IDENTITY_VAL_LOCAL (ab welchem Release habe ich nicht im Kopf), mit eigenen generierten Keys geht das immer.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Dec 2012
    Beiträge
    10
    Hallo BenderD,
    ich hab IDENTITY_VAL_LOCAL ausprobiert, sieht gut aus und wäre eine Lösung, aber nicht unter V6
    (seufz, seufz).
    WARUM MÜSSEN SYSTEMENTWICKLER IMMER UNTER VERTRIEBSHEINIES LEIDEN????

    HEG

  8. #8
    Registriert seit
    May 2002
    Beiträge
    1.121
    Werd im nächsten Leben VERTRIEBSHEINI und lasse deinen SYSTEMENTWICKLER leiden ;-)

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    IDENTITY_VAL_LOCAL ist auf alle Fälle schon älter als Release 6.1.
    Wir setzen es auf alle Fälle unter V5R4 ein (und wenn ich mich recht erinnere hatten wir es bereits unter V5R2 am Laufen).

    Ich leide auch noch unter den Altlasten, aber weniger der Vertriebsfuzzis, sondern viel mehr der Wiederstandskraft einiger Kunden gegenüber Neuerungen.
    Software-Häuser (sofern sie nicht gerade SAP o.ä heißen) sind am ärmsten dran, wir dürfen/können erst dann eine Stufe höher gehen wenn der letzte Kunde die nächste Stufe erreicht hat.

    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... IDENTITY_VAL_LOCAL kam mit V5R2 und davor gab es schon keinen Grund diesen Murks mit RRN zu versuchen (das taugt als Key Kriterium garnichts). Das geht mit einer Kunstkey Spalte und einer UDF GetKey, wie sie auf meiner Freeware Seite zu finden ist, einfach, elegant und schnell. Im Programm erst den Schlüssel holen, sich merken und dann insert.
    Ganz am Rande sei vermerkt: wenn ich erst den Satz schreibe, dann noch weitere Werte ermittle und dazu den Satz nochmal lese, dann ist das von rückwärts durch die Brust ins Auge - Programm technische Komplexität ist meistens ein Zeichen für zweitbestes Design. Wobei eine Datei ohne primary Key ist natürlich immer Murks.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Dec 2012
    Beiträge
    10
    Danke, danke für die schnelle Hilfe.
    @ B.Hauser Ich werd mich nochmal drum kümmern, vielleicht hab ich ja was falsch gemacht.
    @ B.Hauser Bei uns ist das auch so: erst wenn der letzte V5R3M0(!!!) verlassen hat....

    @ Admi: Thread kann als gelöst geschlossen werden.

Similar Threads

  1. SQL V5R4 Insert into
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 10-10-14, 08:13
  2. RPGLE Trigger before insert übernimmt neue Werte nicht
    By msost in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 07-10-14, 13:15
  3. Cobol-Compiler
    By infomio in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 03-04-03, 12:58
  4. SQL insert mit variable
    By Robi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 21-03-03, 09:16
  5. COBOL
    By Claudia Lange in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 23-07-02, 11:32

Tags for this Thread

Berechtigungen

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