このINMODの例は、機能コードを読み取り、その値に応じて異なる処理機能を実行します。
//JCKLC1 JOB 1,'JAMES KIM',MSGCLASS=A,NOTIFY=JCK,CLASS=B, REGION=4096K //****************************************************************** //* * //* IDENTIFY NECESSARY LOAD LIBRARIES * //* * //****************************************************************** //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 //C EXEC PGM=LC370B //STEPLIB DD DSN=TER2.SASC301H.LOAD,DISP=SHR // DD DSN=TER2.SASC301H.LINKLIB,DISP=SHR //SYSTERM DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(10,10)) //SYSUT2 DD UNIT=SYSDA,SPACE=(TRK,(10,10)) //SYSLIN DD DSN=&&OBJECT,SPACE=(3200,(10,10)),DISP=(MOD,PASS), // UNIT=SYSDA //SYSLIB DD DSN=TER2.SASC301H.MACLIBC,DISP=SHR //SYSDBLIB DD DSN=&&DBGLIB,SPACE=(4080,(20,20,1)),DISP=(,PASS), // UNIT=SYSDA,DCB=(RECFM=U,BLKSIZE=4080) //SYSTMP01 DD UNIT=SYSDA,SPACE=(TRK,25) VS1 ONLY //SYSTMP02 DD UNIT=SYSDA,SPACE=(TRK,25) VS1 ONLY //SYSIN DD DATA,DLM=## /* This program is for Teradata MultiLoad INMOD testing using C user exit routine. When this routine is activated it looks at the content of the function code passed (a->code) and depending on its value, it 0) initializes, i.e., opens a file, etc... 1) reads a record 5) acknowledges "close inmod" request. The user exit routine must return "return code"(a->code) and "length" (a->len). You should send return code = zero when no errors occur and non-zero for an error. Teradata MultiLoad expects length = zero at the end of file. Then it sends "CLOSE INMOD" request. THE USER EXIT routine must explicitly return "return code" = ZERO to terminate the conversation. */ #include <stddef.h> #include <stdlib.h> #include <stdio.h> typedef unsigned short Int16; typedef unsigned char Int8; typedef unsigned long int Int32; /* PASSING parameter structures */ typedef struct { Int32 code; Int32 len; Int8 buf[80]; } inmodbuf; typedef struct { Int32 seq; Int16 len; char param[80]; } inmodpty; static FILE *IN; static int count=0; char *memcpy(); void _dynamn(a,b) inmodbuf *a; inmodpty *b; {int code=0; char tempbuf[80]; memcpy(tempbuf,a->buf,sizeof(a->buf)); tempbuf[79]='\0'; printf("BEGIN--> %d %d %s\n",a->code,a->len,tempbuf); printf(" +++ %d %d %s\n",b->seq ,b->len,b->param); code= (int) a->code; switch (code) { case 0: /* Here you open the file and read the first record */ printf("## CODE=0, openinig...\n"); IN=fopen("ddn:INDATA","rb"); if (! ferror(IN)) { if (! readrecord(a)) fclose(IN); }; break; case 1: /* Teradata MultiLoad requested next record, read it */ printf("## CODE=1, reading...\n"); if (! readrecord(a)) fclose(IN); break; case 5: /* Teradata MultiLoad is closing INMOD routine */ a->code=0; a->len=0; printf("## CODE=5, terminating...\n"); break; default: a->code=12; /* any number not = to zero */ a->len=0; printf("##### UNKNOWN code ######\n");a->code=0;a->len=0; }; memcpy(tempbuf,a->buf,sizeof(a->buf)); tempbuf[79]='\0'; printf("END --> %d %d %s\n",a->code,a->len,tempbuf); printf(" +++ %d %d %s\n",b->seq ,b->len,b->param); } int readrecord(a) inmodbuf *a; { int rtn=0; char tempbuf[80]; if (fread((char *)&(a->buf),sizeof(a->buf),1,IN)) { count++; memcpy(tempbuf,a->buf,sizeof(a->buf)); tempbuf[79]='\0'; printf(" %d %s \n",count,tempbuf); a->len=80; a->code=0; rtn=1; }; if ferror(IN) { printf("==== error ====\n"); a->code=16; /* any non zero number */ a->len=0; }; if feof(IN) { /* EOF, set length = zero */ printf("=== EOF ===\n"); a->code=9; a->len=9; }; return(rtn); } ## //LKED EXEC PGM=LINKEDIT,PARM='LIST,MAP',COND=(8,LT,C) //SYSPRINT DD SYSOUT=*,DCB=(RECFM=FBA,LRECL=121,BLKSIZE=1210) //SYSTERM DD SYSOUT=*00153 //SYSLIN DD DSN=*.C.SYSLIN,DISP=(OLD,PASS),VOL=REF=*.C.SYSLIN // DD DDNAME=SYSIN //SYSLIB DD DSN=TER2.SASC301H.SUBLIB,DISP=SHR //SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,DCB=BLKSIZE=1024, // SPACE=(1024,(200,50))00158 //SYSLMOD DD DSN=JCK.INMOD.LOAD(INMODG1),DISP=MOD,UNIT=3380, // VOLUME=SER=TSO805 //SYSIN DD DATA,DLM=## NAME INMODG1(R) ## //BDLDEL EXEC PGM=IEFBR1400164 //BDLLOG DD DSN=JCK.INMOD.TDQ8.BDLLOG, // DISP=(MOD,DELETE),UNIT=SYSDA,SPACE=(TRK,0) //BDLCAT 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=*00171 //BDLLOG DD DSN=JCK.INMOD.TDQ8.BDLLOG,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 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=* //SYSABEND DD SYSOUT=* //SYSIN DD DATA,DLM=## .LOGON TDQ8/DBC,DBC; DROP TABLE XXXX.LOGTABLE; DROP TABLE XXXX.ET_INMODLC1; DROP TABLE XXXX.UV_INMODLC1; DROP TABLE XXXX.WT_INMODLC1; .QUIT; .LABEL NODROP; .EXIT 4; ## //****************************************************************** //* * //* RUN Teradata 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=338 //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.INMODLC1; CREATE TABLE INMODLC1 (F1 CHAR(10), F2 CHAR(70)); .BEGIN IMPORT MLOAD TABLES INMODLC1; .Layout layname1; .Field L1Fld1 1 Char(10); .Field L1Fld2 * Char(70); .DML Label DML1; INSERT INMODLC1(F1,F2) VALUES (:L1FLD1, :L1FLD2); .IMPORT INMOD inmodg1 using ("AAA" "BBB") LAYOUT LAYNAME1 APPLY DML1 ; .End Mload; .LOGOFF; ## //INDATA DD DATA,DLM=## 01C AAAAAAAAAAAAAAAA 02C BBBBBBBBBBBBBBBB 03C CCCCCCCCCCCCCCCC 04C DDDDDDDDDDDDDDDD00229 ## //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=* //SYSABEND DD SYSOUT=* //SYSIN DD DATA,DLM=## .LOGON TDQ8/XXXX,XXXX; SELECT * FROM INMODLC1; .LOGOFF; ##