z/OS Assembler INMOD Example - MultiLoad

Teradata MultiLoad Reference

Product
MultiLoad
Release Number
15.10
Language
English (United States)
Last Update
2018-10-06
dita:id
B035-2409
lifecycle
previous
Product Category
Teradata Tools and Utilities

Assembler INMOD Example

This INMOD example obtains records from the Teradata Database that can be used to insert, update, or delete rows of a target table.

             
             
             
             //JCKAS1 JOB 1,'JAMES KIM',MSGCLASS=A,NOTIFY=JCK,CLASS=B,
             REGION=4096K 
             //**************************************************************** 
             //*                                                              * 
             //*     IDENTIFY NECESSARY LOAD LIBRARIES FOR RELEASE 4.1        * 
             //*                                                              * 
             //**************************************************************** 
             //JOBLIB   DD  DISP=SHR,DSN=STV.GG10.APP.L 
             //         DD  DISP=SHR,DSN=STV.GG00.APP.L 
             //         DD  DISP=SHR,DSN=STV.TG00.APP.L 
             //         DD  DISP=SHR,DSN=STV.RG00.APP.L 
             //         DD  DISP=SHR,DSN=TER2.SASC301H.LINKLIB 
             //ASMFCL   EXEC ASMFCL 
             //ASM.SYSIN DD * 
             DYNAMN TITLE '--CONCATENATE INPUT RECORDS FOR INPUT TO MULTILOAD' 
             DYNAMN CSECT
                    USING DYNAMN,15
             ****************************************************************** 
             *  THIS PROGRAM IS CALLED BY THE TERADATA MULTILOAD PROGRAM      * 
             *  TO OBTAIN A RECORD TO BE USED TO INSERT, UPDATE, OR DELETE    * 
             *  ROWS OF A TARGET TABLE                                        * 
             *                                                                * 
             *  THIS PROGRAM IS NOT REENTRANT                                 * 
             *  FUNCTION:                                                     * 
             *         READ AN INPUT RECORD AND ADD A FOUR-BYTE INTEGER FIELD * 
             *         TO THE FRONT OF THE RECORD.  THE NEW FIELD WILL        * 
             *         CONTAIN A SEQUENCE NUMBER THAT RANGES FROM 1 TO ...    * 
             *         NUMBER-OF-INPUT-RECORDS.                               * 
             *                                                                * 
             *         RETURN TO THE CALLER (MULTILOAD) INDICATING            * 
             *         THAT MORE RECORDS ARE AVAILABLE OR NO MORE RECORDS     * 
             *         ARE TO BE PROCESSED.                                   * 
             *                                                                * 
             *  THIS INMOD PROGRAM CAN BE USED TO ENSURE UNIQUE RECORDS       * 
             *  IN CERTAIN APPLICATIONS, THE SEQUENCE FIELD                   * 
             *  CAN BE USED FOR "DATA SAMPLING".                              * 
             *                                                                * 
             *  DDNAME OF THE INPUT DATA SET: "INDATA"                        * 
             ****************************************************************** 
                      B    STOREGS                  BRANCH AROUND EP
                      DC   AL1(31)                  DEFINE EP LENGTH
                      DC   CL9'DYNAMN  '            DEFINE
                      DC   CL9'&SYSDATE'               ENTRY
                      DC   CL8'    VM '                   POINT
                      DC   CL5'&SYSTIME'                     IDENTIFIER
             ****************************************************************** 
             *                         SAVE REGISTERS                         * 
             ****************************************************************** 
             STOREGS  DS    0H                     DEFINE AND ALIGN SYMBOL
                      STM   R14,R12,12(R13)        STORE OFF CALLER'S REGISTERS
                      LR    R12,R15                COPY BASE ADDRESS
                      DROP  R15                    DROP VOLATILE BASE REGISTER
                      USING DYNAMN,R12             ESTAB PERM CSECT ADDRBLTY
                      LA    R14,SAVEAREA           POINT AT LOCAL SAVE WORK
                      ST    R14,8(,R13)            STORE FWD LINK IN SA CHAIN
                      ST    R13,4(,R14)            STORE BWD LINK IN SA CHAIN
                      LR    R13,R14                COPY LOCAL SAVE/WORK AREA
                                                   ADDR
                      L     R11,0(,R1)             POINT TO PARM
                     SPACE 1
             ****************************************************************** 
             *                     OPEN  "DATA" DATA SET                      * 
             *                     (ONLY THE FIRST TIME)                      * 
             ******************************************************************
                      USING PREBUF,R11        COVER PRE-PROC AREA              
                      LA    R9,PREREC         POINT TO START OF PREPROC.
                                              DATA
                      OC    PRECODE,PRECODE   FIRST ENTRY ?
                                              (0=FIRST ENTRY)
                      BNZ   NOOPEN            NO, SKIP OPEN
                      USING IHADCB,R10        YES,COVER DCB FOR OPEN
                      LA    R10,INDATA        POINT TO DATA DCB
                      OPEN  INDATA            OPEN INPUT DATA SET
                      TM    DCBOFLGS,X'10'    DID IT OPEN ?
                      BO    OPENOK            YES,
                      WTO   'UNABLE TO OPEN INDATA DATA SET',ROUTCDE=11
                              B     BADRET            RETURN WITH ERROR CODE
             ****************************************************************** 
             *       CHECK MULTILOAD STATUS CODES                             * 
             *  0 =  FIRST ENTRY    (MULTILOAD EXPECTS TO RECEIVE A RECORD)   * 
             *  1 =  GET NEXT RECORD  MULTILOAD EXPECTS TO RECEIVE A RECORD)  * 
             *  2 =  CLIENT RESTART CALL (MULTILOAD DOES NOT EXPECT A RECORD) * 
             *  3 =  CHECKPOINT CALL   (MULTILOAD DOES NOT EXPECT A RECORD)   * 
             *  4 =  RESTART CALL      (MULTILOAD DOES NOT EXPECT A RECORD)   * 
             *  5 =  CLOSE INMOD       (MULTILOAD DOES NOT EXPECT A RECORD)   * 
             *                                                                * 
             *  NOTE: CODES 2,3 AND 4 ARE NOT HANDLED BY THIS PROGRAM         * 
             ****************************************************************** 
             OPENOK   DS    0H 
             NOOPEN   L     R15,PRECODE            CHECK ON CODE FROM MULTILOAD
                      C     R15,=F'1'              NEED RECORD ?
                      BH    NOREC                  NO , DO NOT "GET" A RECORD
                      L     R15,SAMPNUM            GET CURRENT SAMPLE NUM.
                      LA    R15,1(R15)             INCR BY 1
                      ST    R15,0(R9)              STORE AT FRONT OF RECORD
                      ST    R15,SAMPNUM            RESET COUNTER
                      LA    R9,4(R9)               ADVANCE FOR READ ADDR.
                      LA    R10,INDATA             COVER INDATA DCB
             GETNEXT  GET   INDATA,(R9)            READ A RECORD
             INCREC   LH    R9,DCBLRECL            GET RECORD LENGTH
                      AH    R9,=H'4'               ADD 4 FOR NEW FIELD
                      SR    R15,R15                SET RETURN CODE VALUE
             RETURN   ST    R9,PRELEN              SET LENGTH (ZERO AFTER EOF) 
                      ST    R15,PRECODE
                      L     R13,4(R13)
                      RETURN  (14,12),RC=0
                      RETURN
                      SPACE 5
             ****************************************************************** 
             *       EOF ENTERED AT END-OF-FILE                               *
             ****************************************************************** 
             EOF      CLOSE INDATA,                CLOSE INPUT DATA SET
             ****************************************************************** 
             NOREC    SR    R15,R15                SET ZERO RETURN CODE
                      SR    R9,R9                  SET ZERO LENGTH
                      B     RETURN                 RETURN
             * 
             BADRET   LA    R15,16                 SET RETURN CODE FOR ERROR
                      SR    R9,R9                  SET LENGTH = 0 
                      B     RETURN                 ERROR RETURN 
                      EJECT
             *
             *        CONSTANTS
             *
             *        REGEQU
             R0       EQU  0
             R1       EQU  1
             R2       EQU  2
             R3       EQU  3
             R4       EQU  4
             R5       EQU  5
             R6       EQU  6
             R7       EQU  7
             R8       EQU  8
             R9       EQU  9
             R10      EQU  10
             R11      EQU  11
             R12      EQU  12
             R13      EQU  13
             R14      EQU  14
             R15      EQU  15
                      EJECT 
             *
             *        DATA STRUCTURES AND VARIABLES 
             *
                      SPACE 1
             SAVEAREA DC    9D'0'                    SAVE AREA
             SAMPNUM  DC    F'0'
                      SPACE 10
             INDATA   DCB   DDNAME=INDATA,MACRF=(GM),DSORG=PS,EODAD=EOF
             PREBUF   DSECT
             PRECODE  DS    F
             PRELEN   DS    F
             PREREC   DS    0XL31000
                      DCBD  DEVD=DA,DSORG=PS
             PREPRM   DSECT
             PRESEQ   DS    F
             PREPRML  DS    H
             PREPRMS  DS    CL80
                      END
             //LKED.SYSLMOD DD DSN=JCK.INMOD.LOAD(INMODG1),DISP=MOD,UNIT=3380, 
             //          VOLUME=SER=TSO805 
             //LKED.SYSIN DD  *
              ENTRY DYNAMN 
              NAME INMODG1(R)
             /* 
             //MLOADDEL EXEC PGM=IEFBR14 
             //MLOADLOG DD  DSN=JCK.INMOD.TDQ8.MLOADLOG, 
             //         DISP=(MOD,DELETE),UNIT=SYSDA,SPACE=(TRK,0) 
             //MLOADCAT   EXEC PGM=BLKMAIN 
             //STEPLIB  DD  DSN=STV.GG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.TG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.RG00.APP.L,DISP=SHR 
             //SYSPRINT DD  SYSOUT=* 
             //MLOADLOG DD  DSN=JCK.INMOD.TDQ8.MLOADLOG,DISP=(NEW,CATLG), 
             //         UNIT=SYSDA,DCB=(RECFM=F,DSORG=PS,LRECL=8244), 
             //         SPACE=(8244,(12,5)) 
             //SYSIN    DD  * 
             //**************************************************************** 
             //*  THIS STEP WILL ONLY DROP THE TABLES                         * 
             //*  IF MLOAD IS NOT IN APPLY PHASE                              * 
             //**************************************************************** 
             //CREATE   EXEC BTEQ 
             //STEPLIB  DD  DSN=STV.GG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.TG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.RG00.APP.L,DISP=SHR 
             //SYSPRINT DD  SYSOUT=A 
             //SYSABEND DD  SYSOUT=* 
             //SYSIN    DD  DATA,DLM=## 
             .LOGON TDQ8/DBC,DBC;
             RELEASE MLOAD XXXX.INMODAS1;
             .IF ERRORCODE = 2572 THEN .GOTO NODROP; 
             DROP TABLE XXXX.LOGTABLE; 
             DROP TABLE XXXX.ET_INMODAS1; 
             DROP TABLE XXXX.UV_INMODAS1; 
             DROP TABLE XXXX.WT_INMODAS1; 
             .QUIT;
             .LABEL NODROP;
             .EXIT 4;
             ## 
             //********************************************************************
             //*                                                                  *
             //*          RUN MULTILOAD                                           *
             //*                                                                  *
             //********************************************************************
             //LOADIT   EXEC PGM=MLOAD 
             //STEPLIB  DD  DISP=SHR,DSN=STV.GG10.APP.L 
             //         DD  DISP=SHR,DSN=STV.GG00.APP.L 
             //         DD  DISP=SHR,DSN=STV.TG00.APP.L 
             //         DD  DISP=SHR,DSN=STV.RG00.APP.L 
             //         DD  DISP=SHR,DSN=TER2.SASC301H.LINKLIB 
             //         DD  DISP=SHR,DSN=JCK.INMOD.LOAD,VOLUME=SER=TSO805,UNIT=3380
             //SYSPRINT DD  SYSOUT=* 
             //SYSTERM  DD  SYSOUT=* 
             //SYSOUT   DD  SYSOUT=* 
             //SYSIN    DD  DATA,DLM=## 
             .LOGTABLE XXXX.LOGTABLE; 
             .LOGON TDQ8/XXXX,XXXX; 
             /*  TEST DATAIN, DATALOC          */ 
             DROP TABLE XXXX.INMODAS1; 
             CREATE TABLE INMODAS1 (F1 CHAR(10), F2 CHAR(70)); 
             .BEGIN IMPORT MLOAD TABLES INMODAS1; 
             .Layout layname1; 
             .FIELD L1FLD0 1 CHAR(4); 
             .FIELD L1FLD1 * CHAR(10); 
             .Field L1Fld2 * Char(70); 
             .DML Label DML1; 
             INSERT INMODAS1(F1,F2) VALUES (:L1FLD1, :L1FLD2); 
             .IMPORT INMOD INMODG1 USING ("AAA" "BBB") LAYOUT LAYNAME1 APPLY DML1; 
             .End Mload; 
             .LOGOFF; 
             ## 
             //INDATA  DD DATA,DLM=## 
             01ASSEMBLEAAAAAAAAAAAAAAAA 
             02ASSEMBLEBBBBBBBBBBBBBBBB 
             03ASSEMBLECCCCCCCCCCCCCCCC 
             04ASSEMBLEDDDDDDDDDDDDDDDD 
             ## 
             //SELECT   EXEC BTEQ 
             //STEPLIB  DD  DSN=STV.GG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.TG00.APP.L,DISP=SHR 
             //         DD  DSN=STV.RG00.APP.L,DISP=SHR 
             //SYSPRINT DD  SYSOUT=A 
             //SYSABEND DD  SYSOUT=* 
             //SYSIN    DD  DATA,DLM=## 
             .LOGON TDQ8/XXXX,XXXX; 
             SELECT * FROM INMODAS1; 
             .LOGOFF; 
             ## 
             //