MainframeSupports
tip uge 40/2006:

I et tidligere tip har jeg illustreret, hvor let det er at eksekvere en DB2-kommando fra REXX. Hvad hvis nu jeg vil udføre den fra et COBOL eller PL/1 program i stedet. Ja, så er det godt nok en helt anden sag. Det er faktisk så besværligt, at jeg næsten vil fraråde det. Hvis du alligevel ikke kan styre din nysgerrighed kommer her en stump kode, som udfører en -DIS GROUP fra PL/1. Før koden virker skal du have udført en CAF CONNECT til det DB2 subsystem, du vil eksekvere kommandoen på:

DCL dsnwli EXTERNAL ENTRY OPTIONS(ASM INTER RETCODE);
DCL function CHAR(8);
DCL 01 ifca,
    02 lngth FIXED BIN(15),
    02 unused FIXED BIN(15),
    02 eye_catcher CHAR(4),
    02 owner_id CHAR(4),
    02 ifcarc1 FIXED BIN(31),
    02 ifcarc2 FIXED BIN(31),
    02 bytes_moved FIXED BIN(31),
    02 excess_recds FIXED BIN(31),
    02 opn_writ_seq_num FIXED BIN(31),
    02 num_recds_lost FIXED BIN(31),
    02 opn_name_for_reada CHAR(4),
    02 opn_names_area,
    03 opn_lngth FIXED BIN(15),
    03 unused_2 FIXED BIN(15),
    03 array_opn_names(8) CHAR(4),
    02 trace_nos_area,
    03 trace_lngth FIXED BIN(15),
    03 unused_3 FIXED BIN(15),
    03 array_trace_nos(8) CHAR(2),
    02 diagnos_area,
    03 diagnos_lngth FIXED BIN(15),
    03 unused_4 FIXED BIN(15),
    03 diagnos_data CHAR(80);
DCL 01 output_area,
    02 lngth FIXED BIN(15),
    02 unused FIXED BIN(15),
    02 text_or_command CHAR(254);
DCL 01 return_area,
    02 lngth FIXED BIN(31),
    02 rtrn_buff CHAR(4096);

function = 'COMMAND';
ifca = '';
ifca.lngth = storage(ifca);
ifca.eye_catcher = 'IFCA';
ifca.owner_id = 'LOC2';

return_area.rtrn_buff = '';
return_area.lngth = 4096;

output_area.unused = 0;
output_area.lngth = 4 + 11;
output_area.text_or_command = '-DIS GROUP ';

CALL dsnwli(function, ifca, return_area, output_area);

PUT SKIP LIST('IFI RETURN CODE=' !! ifca.ifcarc1);
PUT SKIP LIST('IFI REASON CODE=' !! Ifca.ifcarc2);
PUT SKIP DATA(return_area);

Resultatet af -DIS GROUP DB2-kommandoen er gemt i return_area. Du må selv gå ind og decifrere indholdet, hvis du synes, det skal stå pænt. Det er kaldet til dsnwli, der udfører kommandoen. Arealerne ifca, return_area og output_area skal erklæres som vist. Dog kan du sagtens erklære rtrn_buff større, men husk at assigne den rigtige længde af rtrn_buff til return_area.lngth. Værdien af output_area.lngth skal være 4 større en længden på selve kommando teksten plus en blank. Det er derfor jeg har skrevet 4 + 11, da -DIS GROUP er 10 tegn langt og så en ekstra for den blanke til sidst. Variablene i ifca skal have de værdier, jeg har givet dem.

Det er i øvrigt muligt at kalde dsnwli fra et program, der er startet op under DSN kommandoen. Det overflødiggør brugen af CAF og forenkler selve programmet, der udfører ovenstående kodestump, en smule. Jeg har dog ikke selv prøvet det. Eksemplet viser en DISPLAY kommando, men det virker uden andre ændringer end selve kommandoen også for alle andre DB2-kommandoer. Hold dig dog fra -STOP DB2 kommandoen. Du kan læse meget mere om DSNWLI, som også kaldes IFI interfacet i DB2 administration guide. Linket er til DB2 version 8, men det virker fint for ældre versioner. Hvis du gerne vil fange output fra en DB2-kommando, der fylder mere end størrelsen af return_area er du simpelthen nødt til at læse mere, for det har jeg aldrig prøvet.

Forrige danske tip        Last tip in english        Tip oversigten