顯示具有 UUID 標籤的文章。 顯示所有文章
顯示具有 UUID 標籤的文章。 顯示所有文章

星期五, 11月 10, 2023

2023-11-10 如何於 CL 中產生 UUID ?(Command GENUUID with MI GENUUID)


如何於 CL 中產生 UUID ?(Command GENUUID with MI GENUUID)
How to Generate UUID in CL ? (Command GENUUID with MI GENUUID)

File  : QCLSRC
Member: GENUUIDC
Type  : CLLE

 /*                                                                */
 /*                             \\\\\\\                            */
 /*                            ( o   o )                           */
 /*------------------------oOO----(_)----OOo-----------------------*/
 /*                                                                */
 /*   Program :      GENUUIDC                                      */
 /*   System  :      IBM i V7R2                                    */
 /*   Author  :      Vengoal Chang                                 */
 /*   Date    :      2023/11/10                                    */
 /*   Description :  Generate Universal Unique Identifier (GENUUID)*/
 /*                  GENUUID command CPP                           */
 /*                                                                */
 /*                     ooooO              Ooooo                   */
 /*                     (    )             (    )                  */
 /*----------------------(   )-------------(   )-------------------*/
 /*                       (_)               (_)                    */
 /*                                                                */
 /*                                                                */
 /*   To compile :                                                 */
 /*         The source type must be "CLLE"   (and not CLP).        */
 /*         Compile with STRPDM option 14  or use the              */
 /*         CRTBNDCL command.                                      */
 /*                                                                */
 /*----------------------------------------------------------------*/
             Pgm       Parm(&UUIDP  &UUIDHEX)

             Dcl        &UUIDP          *Char  16
             Dcl        &UUIDHEX        *Char  32

             Dcl        &TMPL           *Char  32
             Dcl        &LEN            *Uint   4  VALUE(32)
             Dcl        &BytPrv         *Uint  Stg(*DEFINED) +
                          Len(4)  DefVar(&TMPL)
             Dcl        &BytAvl         *Uint  Stg(*DEFINED) +
                          Len(4)  DefVar(&TMPL)
             Dcl        &Reserved       *Char  Stg(*DEFINED) +
                          Len(8)  DefVar(&TMPL 10)
             Dcl        &UUID           *Char  Stg(*DEFINED) +
                          Len(16) DefVar(&TMPL 17)
             Dcl        &RcvHexLen      *Int    4  32

             CallPrc    Prc('_PROPB') Parm((&TMPL *ByRef)  +
                                           (X'00' *ByVal)  +
                                           (&LEN  *ByVal))

             ChgVar     &BytPrv      32
             CallPrc    Prc('_GENUUID') Parm((&TMPL *ByRef))

             ChgVar     &UUIDP          &UUID
             CallPrc    PRC('cvthc')             +
                        PARM((&UUIDHEX  *ByRef)  +
                             (&UUID     *ByRef)  +
                             (&RcvHexLen *ByVal))

          /* DmpClPgm    */

 End:        EndPgm


File  : QCMDSRC
Member: GENUUID
Type  : CMD

/*****************************************************************/
/*                                                               */
/* Command name: GenUUID                                         */
/*                                                               */
/* Author      : Vengoal Chang                                   */
/*                                                               */
/* Date written: 2023/11/10                                      */
/*                                                               */
/* Description : Generate Universal Unique Identifier (GENUUID)  */
/*                                                               */
/* To compile:                                                   */
/*     CRTCMD CMD( GenUUID )                                     */
/*            PGM( GenUUIDC )                                    */
/*            SRCMBR( GenUUID )                                  */
/*            ALLOW( *Ipgm *Bpgm )                               */
/*                                                               */
/*****************************************************************/

             Cmd        Prompt('Generate Universal Unique ID')

             Parm       Kwd( UUID )                             +
                          Type(*CHAR)                           +
                          Len(16)                               +
                          RtnVal(*YES)                          +
                          Prompt('CL var for UUID         (16)')

             Parm       Kwd( UUIDHEX )                          +
                          Type(*CHAR)                           +
                          Len(32)                               +
                          RtnVal(*YES)                          +
                          Prompt('CL var for UUID HEX STR (32)')





星期四, 11月 09, 2023

2013-07-01 要如何於 SQL 中取用 UUID?(SQL UDF GENSYSUUID)


要如何於 SQL 中取用 UUID?(SQL UDF GENSYSUUID)

AS400 DB2 SQL 並不支援直接取用 UUID,而是須透過呼叫系統函式 _GENUUID 來產生,
下述 SQL UDF GENSYSUUID,產生 UUID (16 bytes)的 16 進位字串(32 bytes),提供直接於 SQL 中直接取用 UUID。



File  : QRPGLESRC

Member: GENSYSUUID

Type  : RPGLE

Usage : CRTBNDRPG GENSYSUUID


     **
     **  Program . . : GENSYSUUID
     **  Description : Generate UUID(16 bytes) to HexString(32 bytes)
     **  Author  . . : Vengoal Chang
     **  Published . : AS400ePaper
     **  Date  . . . : June 26, 2013
     **
     **
     **
     **  Programmer's notes:
     **
     ** CREATE FUNCTION QGPL.GENSYSUUID ( )
     **  RETURNS CHAR(32)
     **  LANGUAGE RPGLE
     **  SPECIFIC QGPL.GENSYSUUID
     **  NOT DETERMINISTIC
     **  NO SQL
     **  CALLED ON NULL INPUT
     **  EXTERNAL NAME 'QGPL/GENSYSUUID'
     **  PARAMETER STYLE SQL ;
     **
     ** Run STRSQL:
     ** Select GENSYSUUID ( )  from sysIBM.sysdummy1
     **
     ** CREATE TABLE QGPL/LICENSE (
     **            KEYUUID CHAR (32 ) NOT NULL,
     **            CUSTNAME VARCHAR (32 ) NOT NULL WITH DEFAULT,
     **            PRODUCT  VARCHAR (32 ) NOT NULL WITH DEFAULT  )
     **
     ** CREATE TRIGGER QGPL.LICENSE_BI BEFORE INSERT ON QGPL.LICENSE
     **         REFERENCING NEW N FOR EACH ROW MODE DB2ROW
     **         SET N.KETUUID = QGPL.GENSYSUUID();
     **
     ** INSERT INTO license(custname, product) VALUES('Oracle', 'DB2')
     ** select * from qgpl/license
     **
     **
     H Option( *NoSrcStmt ) DftActGrp( *No )
     H Debug
     **
      *
      * MI builtin to create a hex dump of a spot in memory
      *
     D hexdump         PR                  EXTPROC('cvthc')
     D  output                       32A
     D  input                        16A
     D  output_len                   10I 0 value

     D HexUUID         S             32A

     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 GenUuid         PR                  ExtProc('_GENUUID')
     D UUID_template                   *   Value

     D pRtnUUID        S             32
     D pRtnUUIDIn      S              5I 0
     D sqlstate        S              5A
     d functname       S            517A   VARYING
     d specname        S            128A   VARYING
     d errormsg        S             70A   VARYING
     **
     C     *Entry        Plist
     C                   Parm                    pRtnUUID
     C                   Parm                    pRtnUUIDIn
     C                   Parm                    sqlstate
     C                   Parm                    functname
     C                   Parm                    specname
     C                   Parm                    errormsg

     C                   Callp     GenUuid( %Addr( UUID_template ))

     C                   Callp     HexDump( HexUUID :
     C                                      UUID    :
     C                                      %size(HexUUID)
     C                                    )

     C                   Eval      pRtnUUID = HexUUID
     C*                  dump
     **
     C                   Return





參考資訊:

Generate Universal Unique Identifier (GENUUID)