このINMOD例では、ターゲット表の行の挿入、更新、または削除に使用可能なレコードをデータベースから取得します。
//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; ## //