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

Thema: UUID

  1. #13
    Registriert seit
    Feb 2001
    Beiträge
    20.234
    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

  2. #14
    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()));


  3. #15
    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
  •