MainframeSupports
tip uge 52/2018:

Det har nu i rigtig mange år været muligt at udføre SQL statements ved hjælp af DB2 utililty programmet DSNUTILB, som du typisk bruger, når du eksekverer JCL proceduren DSNUPROC. Jeg har indirekte beskrevet denne mulighed i forbindelse med DB2 cross load, som i bund og grund handler om, hvordan man eksekverer SELECT statements med DSNUTILB. Men alle andre SQL statements end SELECT (og WITH) kan også udføres.

Det er utroligt simpelt at udføre alt andet end SELECT. Her er et meget uskyldigt eksempel:

EXEC SQL
SET CURRENT SQLID = USER
ENDEXEC

Ligesom i COBOL og PLI (og andre programmeringssprog, der involverer en compiler), så starter du med at skrive EXEC SQL. Til gengæld er afslutningen af statements en smule anderledes (næsten som i COBOL), da du skal skrive ENDEXEC. Hvilket SQL statement du vælger at putte imellem EXEC SQL og ENDEXEC er helt op til din egen fantasi. Typisk kan du bruge det til at inserte en række i en tabel, så du ved, at den utility, der blev eksekveret lige før dit SQL statement, er kørt OK. Der er sikkert masser af andre gode muligheder, men nu ved du, at muligheden er der.

Der er en særlig detalje ved at udføre SQL statements med DSNUTILB, nemlig at der udføres COMMIT efter hver eneste kald. Faktisk etablerer DSNUTILB en selvstændig thread for hver eneste EXEC SQL. Det betyder, at hvis du vil udføre rigtig mange SQL statements, så skal du ikke bruge DSNUTILB til det, for det vil tage rigtig lang til i forhold til mange af de mere gængse værktøjer som SPUFI, DSNTEP2, DSNTIAUL og DSNTIAD.

En pudsighed ved programmet DSNUTILB er, at det fejler ved tomt input, hvilket kan være ret irriterende, hvis inputtet er genereret. Hvis du under genereringen af input til DSNUTILB finder ud af, at der ikke er noget at lave, så kan du bruge ovenstående eksempel som input, da det ikke foretager noget som helst, men det vil få DSNUTILB til at slutte med returkode 0.

Forrige danske tip        Last tip in english        Tip oversigten