[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Thema: UUID

Hybrid View

  1. #1
    Registriert seit
    Jun 2009
    Beiträge
    316

    Red face UUID

    gibt es auf der AS400 einen ähnlichen SQL Befehl wie den SELECT NEWID()

    auf dem SQL Server?

    Wenn ja, kann ich ein Beispiel haben?

    Vielen Dank

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nein, gibt es leider nicht.
    Hier musst du die C-Funktion GENUUID aufrufen, die dann die MI-Instruction aufruft:
    https://www.ibm.com/support/pages/ge...re-random-uuid
    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
    ... mit GENUUID wäre ich vorsichtig, da hieß es in der Doku "most likely unique" und auf Multiprozessor-Maschinen gab es Kollisionen und ich gehe mal davon aus, dass das immer noch so ist.

    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
    Jan 2012
    Beiträge
    1.120
    So weit ich weiß, gibt es das nicht direkt in SQL. Aber es gibt eine von IBM eine API "_GENUUID", mit der man mit RPG UUIDs generieren kann. Wenn man so ein RPG-Programm hat, könnte man das eine SQL-UDF einpacken und man hätte die gewünschte Funktion auch im SQL.

    Hier ein Beispiel für das RPG:

    Code:
           dcl-proc um_crtUUID export;          
             dcl-pi *n char(36)
             end-pi;
    
         D UUID_template   Ds
         D  UtBytPrv                     10u 0 Inz( %Size( UUID_template ))
         D  UtBytAvl                     10u 0
         D                                8a   Inz( *Allx'00' )
         D  UUID                         16a
         D  Reply                         1a
    
         D GenUuid         PR                  ExtProc('_GENUUID')
         D  UUID_template                  *   Value
    
           GenUuid( %Addr( UUID_template ));
    
          return UUID;
    
          end-proc;

  5. #5
    Registriert seit
    Jun 2009
    Beiträge
    316
    OK vielen Dank für die Hinweise.

    Das RPG Beispiel kenne ich schon
    GENUUID ist ja vllcht wirklich nichts

    Na denn, ich hab gedacht es gibt einen fertigen SQL Befehl, den mir evtl. Birgitta mitteilt.

    Vielen Dank nochmal

    Grüße Dschainers

  6. #6
    Registriert seit
    Nov 2020
    Beiträge
    331
    Es gibt SQL Sequenzen die du dafür verenden kannst.
    Ansonsten kannst du beim Erstellen bei Tabellen eine IDENTITY Spalte erstellen, wo die ID automatisch vom System generiert wird.

    lg Andreas

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.120
    Wenn ich Dschainers richtig verstehe, sucht er ja keine eindeutige ID für eine Tabelle, sondern eine weltweit eindeutige ID.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Laut dem Link der IBM ist das Generieren ja verbessert worden.
    Ein Kunde (AS-Mike) von mir verwendet diese Routine auf einer P9 inzwischen für die Web-Kommunikation und doppelte ID's hats bis jetzt nicht gegeben.
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Laut dem Link der IBM ist das Generieren ja verbessert worden.
    Ein Kunde (AS-Mike) von mir verwendet diese Routine auf einer P9 inzwischen für die Web-Kommunikation und doppelte ID's hats bis jetzt nicht gegeben.
    ... kommt doch immer auf die Anwendung an. Vor identity column und Gedöns auf der AS/400 habe ich mal den Vorschlag genuuid für database keys evaluiert und da haben wir uns im massiv parallel Betrieb wegen Kollisionen für eine andere Lösung entschieden. Gängige Varianten für UUIDs verwürfeln die mac mit einem Timestamp, sind also nur fast eindeutig (most likely unique). Wenn der Timestamp bis zur Taktfrequenz verfeinert wird, bleibt immer noch ein Problem bei Multiprozessor Maschinen (den man mit einem zusätzliche RAND() optimieren kann. Für eine Webanwendung sind die theoretisch denkbaren doppelten Keys meist hinnehmbar, für Datenbankkeys erzeugen sie zusätzlichen Aufwand und schlechtere Fehlertoleranz.

    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/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Gefahr besteht dann wenn man per Massensql UUID's erstellt.
    Für eine Erstinitialisierung kann man ja dann ein Programm erstellen, dass die neue UUID gegen vorhandene UUID's prüft und eben dann eine neue erstellt.
    Das Programm kann auch eine SQL-Funktion sein, das bereits erstellt UUID's in einer Tabelle speichert und verprobt.
    Es gibt übrigens eine MI-Funktion (per C-Funktionen erreichbar), die auch kürzere Zeiten als 1 Sekunde als Wartezeit erlaubt.
    https://www.ibm.com/support/pages/ho...ile-cl-program
    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

  11. #11
    Registriert seit
    Oct 2019
    Beiträge
    16
    Hier ein paar SQL Funktionen falls sie jemand brauchen kann

    edit:
    Der Include für den genuuid Header geht beim Posten immer kaputt, da sollte '#include (Kleiner-als-Zeichen)mih/genuuid.h(Größer-als-Zeichen)' stehen.

    Code:
    CREATE TYPE UUID AS BINARY(16) WITH COMPARISONS;
    
    CALL QCMDEXC('CRTSRCPF FILE(QTEMP/TMP) MBR(TMP) RCDLEN(200)');
    INSERT INTO QTEMP.TMP(SRCDTA) VALUES
        ('#include '),
        ('_UUID_Template_T uuid_template = { sizeof(_UUID_Template_T) };'),
        ('_GENUUID(&uuid_template);'),
        ('cpybytes(MAIN.RESULT, uuid_template.uuid, 16);');
    
    CREATE OR REPLACE FUNCTION GENERATE_UUID()
        RETURNS UUID
        LANGUAGE SQL
        CONTAINS SQL
        NO EXTERNAL ACTION
        NOT DETERMINISTIC
        MAIN:BEGIN
            DECLARE RESULT BINARY(16) DEFAULT bx'';
            INCLUDE QTEMP/TMP(TMP);
            RETURN RESULT;
        END;
    
    CREATE OR REPLACE FUNCTION UUID_TO_STRING(UUID UUID)
        RETURNS CHAR(36)
        LANGUAGE SQL
        CONTAINS SQL
        NO EXTERNAL ACTION
        DETERMINISTIC
        RETURN LOWER(
            HEX(SUBSTR(CAST(UUID AS BINARY(16)), 1, 4)) CONCAT '-' CONCAT
            HEX(SUBSTR(CAST(UUID AS BINARY(16)), 5, 2)) CONCAT '-' CONCAT
            HEX(SUBSTR(CAST(UUID AS BINARY(16)), 7, 2)) CONCAT '-' CONCAT
            HEX(SUBSTR(CAST(UUID AS BINARY(16)), 9, 2)) CONCAT '-' CONCAT
            HEX(SUBSTR(CAST(UUID AS BINARY(16)), 11, 6))
        );
    
    CREATE OR REPLACE FUNCTION UUID_FROM_STRING(UUID_STRING VARCHAR(36))
        RETURNS UUID
        LANGUAGE SQL
        CONTAINS SQL
        NO EXTERNAL ACTION
        DETERMINISTIC
        RETURN CAST(HEXTORAW(
            SUBSTR(UUID_STRING, 1, 8) CONCAT
            SUBSTR(UUID_STRING, 10, 4) CONCAT
            SUBSTR(UUID_STRING, 15, 4) CONCAT
            SUBSTR(UUID_STRING, 20, 4) CONCAT
            SUBSTR(UUID_STRING, 25, 12)
        ) AS UUID);
        
        
    VALUES GENERATE_UUID();
    VALUES UUID_TO_STRING(GENERATE_UUID());
    VALUES UUID_FROM_STRING(UUID_TO_STRING(GENERATE_UUID()));


  12. #12
    Registriert seit
    Oct 2019
    Beiträge
    16
    Die in der UUID enthaltene Timestamp hat laut Doku "uniqueness bits" und sollte dem entsprechend ähnlich wie %TIMESTAMP(*UNIQUE) Kollisionen vermeiden.
    https://www.ibm.com/docs/en/i/7.3?to...tifier-genuuid
    https://www.ibm.com/docs/en/i/7.3?to...IN__HDRTIMEFMT

Berechtigungen

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