[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Jan 2008
    Beiträge
    93

    SQL Auto Increment

    Hallo Allerseits, oder meinentwegen auch Helau oder dergleichen......

    Ich habe folgendes Problem. In einer DDS-definierten Tabelle gibt es ein numerisches Feld, welches beim Füllen der Tabelle mittels eines SQL-Statements (insert into TABLE.......) 'automatisch' hochgezählt werden soll.....

    Wie kann/könnte man sowas in SQL realisieren?

    OS/400 V5R4

    Vielen Dank für alle Tips

    Grüsse

    Alexander

  2. #2
    Registriert seit
    Jan 2008
    Beiträge
    58

    SQL Auto Increment

    Hallo WEIDENHAMMER & *ALL !

    ich glaube, das geht so :

    CREATE TABLE TBL (LFDNR INTEGER GENERATED ALWAYS AS IDENTITY
    (START WITH 10 , INCREMENT BY 10), usw...andere Felder . Natürlich START WITH und INCREMENT BY dürfen andere Werte haben.
    Viel Spaß noch für Heute.

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Per CREATE SEQUENCE kannst du einen Zähler erstellen.
    Per "NEXT VALUE FOR MySeq" kannst du den dann zählen lassen.

    Alternativ machst du einen BEFORE-INSERT-Trigger und veränderst den Puffer selber.

    Problem:
    Beim Insert erfährst du nichts über die vergebene Sequence-Nr.

    Nächste Alternative ist ein Feld vom Typ ROWID, die wird vom System selber verwaltet.

    Auch hier erfährst du beim Insert zunächst nichts.
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo,

    ROWID ist alles andere als ein vernüftiger Zähler!!!
    Sondern ein verschlüsselter 40A Wert!

    Entweder man generiert die Tabelle mit SQL neu und verwendet eine Identity Column oder man geht den Weg über das SEQUENCE-Objekt und before Insert Trigger.

    Übrigens kann man auch aus dem Sequence Objekt den aktuellen Zähler ermitteln.

    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
    Mar 2002
    Beiträge
    5.287
    Hallo,

    was ist schon vernünftig? was für MS-Access vernünftig sein mag, muss für DB2 noch lange nicht vernünftig sein. Diese Auto Increment Felder sind da ein typisches Beispiel: was mit einer einzigen zentralen Procedure getKey(Dateiname, Feld) einfach und durchschaubar programmierbar war, wird mit aller Gewalt dadurch ersetzt, dass man sich einen Schlüsselwert von der Datenbank reinmalen lässt und anschließend eine Funktion aufrufen muss, die einem mitteilt, was die Datenbank jetzt da rein gemalt hat und warum das ganze? Einfacher wird es dadurch nicht, durchschaubarer auch nicht, aber MS-Access kann das ja schließlich auch?! Dieses Feature kann nur in der Fassenacht entstanden sein.

    mfg

    Dieter Bender

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hallo,

    ROWID ist alles andere als ein vernüftiger Zähler!!!
    Sondern ein verschlüsselter 40A Wert!

    Entweder man generiert die Tabelle mit SQL neu und verwendet eine Identity Column oder man geht den Weg über das SEQUENCE-Objekt und before Insert Trigger.

    Übrigens kann man auch aus dem Sequence Objekt den aktuellen Zähler ermitteln.

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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Naja, ganz so schlimm ist es ja nicht.
    Ich arbeite auch gerne mit dem Zähler, da viele Zugriffe und Querverweise mit dieser eindeutigen Nummer einfach klarer sind.
    Ausserdem stellt es (ggf.) sicher, dass man nicht so einfach per ODBC Daten unterjubeln kann.

    Um den Wert zu erfragen, kann man auch in 2 Schritten vorgehen, wenn man denn das Ergebnis benötigt:

    exec sql set : MyCount = next value for MySeq;
    insert into mytable Values(: MyCount, ...);

    Ob das aber performant ist ...
    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
    Mar 2002
    Beiträge
    5.287
    Eindeutiger Schlüssel immer, Kunstkey (sprich Zähler) meistens, wegen der Problematik Änderung semantischer Keyfelder und einfacherer Normalisierung, die Alternative ist dabei:
    - Erzeugung des Schlüssels in der Applikation und reinschreiben in die Datenbank
    - Erzeugung des Schlüsselwertes in der Datenbank und dann ermitteln aus der Datenbank
    Bei Access (Eingabe in die Datenbank ohne Applikation) spricht einiges für den zweiten Weg. Bei DB2 spricht vieles für den ersten Weg, es sei denn, man will wirklich mit ODBC (oder von der schnellen Eingreiftruppe DFU 9) ohne Applikation Daten in die Datenbank reinmalen lassen - net wirklich ernst gemeint???

    D*B

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Naja, ganz so schlimm ist es ja nicht.
    Ich arbeite auch gerne mit dem Zähler, da viele Zugriffe und Querverweise mit dieser eindeutigen Nummer einfach klarer sind.
    Ausserdem stellt es (ggf.) sicher, dass man nicht so einfach per ODBC Daten unterjubeln kann.

    Um den Wert zu erfragen, kann man auch in 2 Schritten vorgehen, wenn man denn das Ergebnis benötigt:

    exec sql set : MyCount = next value for MySeq;
    insert into mytable Values(: MyCount, ...);

    Ob das aber performant ist ...
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Feb 2005
    Beiträge
    7
    Ich glaube dort hast du die Lösung zu deinem Problem.
    Eine user defined SQL function zum realisieren von SQL increment.

    Four Hundred Guru--Numbering Rows in an SQL Result Set

    lg
    Rainer

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Eine der schlechtesten Lösungen für INSERT, da der Zähler nicht gespeichert ist.
    Beim Select einfach die Zeilen durchnumerieren mag ja ganz nett sein, spätestens beim Order By kann man das vergessen.
    Parallelverarbeitung von SQL muss ebenso ausgeschlossen werden.
    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
    Jun 2005
    Beiträge
    9

    SQL - insert plus select mit inkremetiertem Wert?

    Hallo zusammen,

    ich hoffe, es ist okay, wenn ich den alten Thread wieder aufwärme. Ich habe ein ähnliches Problem wie der Ursprungsposter und habe es wie von Fuerchau vorgeschlagen mittels "create sequence" und "next value" versucht. Leider hat das nicht funktioniert. Vielleicht habe ich auch nur die sequence an der falschen Stelle created.

    Code:
    // cHk = CONST Hochkomma
     chrSQL = ' +
              insert into datei4 +
               (dnr, dlabel, dname) +
              ( +
                  ( +
                  select  NEXT VALUE FOR seq_zaehler ,' + 
                     cHk + $name + cHk + ', NAME from datei1 + 
                  ) +
    
                 union +
    
                  ( +
                   select  NEXT VALUE FOR seq_zaehler ,' +
                      cHk + $name2 + cHk + ', NAME from datei2 )' + 
                 'order by '+ chrSort + ' ' + chrSortR + ')+
         )';
    
    exec sql set option commit=*none;
    exec sql prepare IINSERT from :chrSQL;
    exec sql create sequence seq_zaehler start with 1 increment by 1 no maxvalue;
    exec sql execute IINSERT;
    (RPG/V6R1)

    Das Ergebnis ist SQLCOD -518.
    Ist das so überhaupt möglich?

    Vielen Dank für jeden Hinweis!
    K.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    NEXT VALUE geht nicht beim Select!

    Die Syntax ist
    insert into myfile
    (seqfld, feld1, feld2, feld3)
    values(next value for myseq, wert1, wert2, wert3)

    Du siehst, ein "Insert ... select ... from ..." funktioniert hier nicht.

    Du musst dann die Tabelle mit einer AutoIncrement-Feld erstellen und dieses Feld beim Insert dann weglassen:

    create mytable (myseq as identity, ...)

    PS:
    Hier noch mal ein genaues Beispiel aus dem Handbuch:

    CREATE TABLE
    EMPLOYEE2 (
    EMPNO INTEGER GENERATED ALWAYS AS IDENTITY,
    ID SMALLINT,
    NAME CHAR(30),
    SALARY DECIMAL(5,2),
    DEPTNO SMALLINT)

    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
    Aug 2001
    Beiträge
    2.873
    Das Problem ist, dass NEXT Value For nicht direkt in Verbindung mit Union-Anweisungen zulässig ist.

    Das Statement sollte funktionieren, wenn Du die Union-Anweisung als Sub-Select definierst.

    Etwa so:
    PHP-Code:
    insert into LastTable (DNrDlabelDName)
          (
    Select Next Value for Seq_Zaehlerx.*
             
    From (Select FldLabelFldName from MyTable
                     Union All 
                   Select XYZLabel
    XYZName from NextTable
    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

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. Auto increment; wie Startwert und Schrittweite definieren?
    By deni87991 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 14-08-06, 12:05
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Identity Colum / Auto increment selbst erzeugen?
    By scoobydoo in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 25-11-05, 10:40

Berechtigungen

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