MainframeSupports
tip uge 47/1999:

Her i MainframeSupport har vi gennem tiderne brugt megen tid på at lave SQL-kald, som danner andre SQL-kald eller færdigt input til diverse utility-programmer. Det har som regel den ulempe, at vi manuelt skal ind og redigere lidt i output fra det program, som vi har benyttet til at udføre SQL-kaldet med. Typisk anvender vi SPUFI til den slags. Men så en dag fik en af os den geniale ide, at anvende DSNTIAUL til at udføre SQL-kaldet med, som anvist i uge 15.

Følgende job er et eksempel på anvendelsen:

//GENERATE EXEC PGM=IKJEFT01
//SYSTSIN  DD *
    DSN SYSTEM(DB2)
    RUN PROGRAM(DSNTIAUL) PARMS('SQL')
    END
/*
//SYSTSPRT DD SYSOUT=*
//SYSPUNCH DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSREC00 DD DSN=&GENDATA,DISP=(NEW,PASS),
//         SPACE=(TRK,(1,10),RLSE)
//SYSIN    DD *
    SELECT SUBSTR
         ( 'REPAIR SET TABLESPACE '
         !! DBNAME !! '.' !! NAME !! ' NOCOPYPEND'
         !! '                                        '
         !! '                                        '
         , 1, 80
         )
    FROM SYSIBM.SYSTABLESPACE
    WHERE DBNAME = 'DSNDB04'
    ORDER BY 1
    ;
/*
//EXECUTE  EXEC PGM=DSNUTILB,REGION=6M,
//         PARM='DBGS,EXECUTE.DSNTIAUL'
//SYSIN    DD DSN=&GENDATA,DISP=(OLD,DELETE)
//SYSPRINT DD SYSOUT=*
//UTPRINT  DD SYSOUT=*

Det første step genererer i dette eksempel et REPAIR-statement pr. tablespace i databasen DSNDB04, som fjerner en eventuel COPY PENDING status. Det andet step udfører de genererede statements. Hvad det andet step gør med det genererede output fra det første step, er det egentlig kun fantasien, der sætter grænserne for. Ligeledes er det også kun fantasien og indholdet af diverse DB2-tabeller, der sætter grænserne for, hvad man kan danne af output i det første step. Der er dog et par spilleregler, der skal overholdes i SQL-kaldet.

For det første er det vigtigt, at have en SUBSTR rundt om den tegnstreng, man opbygger. I modsat fald vil DB2 returnere en tegnstreng som VARCHAR, hvorefter man efterfølgende skal skrælle de to første bytes i &GENDATA af, da de vil indeholde en til formålet ubrugelig længdeangivelse. For det andet er det vigtigt at efterstille tegnstrengen med et antal blanke, så man altid udfører SUBSTR-funktionen på en tegnstreng, der er lang nok til at indeholde de tegn, som SUBSTR-funktionen opererer på. SUBSTR-funktionen i DB2 efterstiller nemlig ikke automatisk blanke, som eksempelvis REXX gør. I eksemplet efterstilles der altid 80 blanke. Desværre har DB2 ingen smart funktion til at lave 80 blanke med, så de skal angives "the hard way".

Læg i øvrigt mærke til, at SYSPUNCH er sat til DUMMY. Der er absolut ingen grund til at gemme på det LOAD-statement, som DSNTIAUL genererer, når man anvender de udtrukne data som input til alt andet end en DB2 LOAD-utility. Bemærk også, at ovenstående steps ikke nødvendigvis kører på din installation, da du måske skal angive STEPLIB og sandsynligvis også skal angive et andet navn på DB2-systemet.

Sidste uges tip        Tip oversigten