MainframeSupports
tip uge 2/2000:

Har det også tit irriteret dig, at man som almindelig dødelig programmør skal bruge DSN-kommandoen og RUN-kommandoen til at starte sine DB2-programmer op med. Det behøver man faktisk slet ikke. Lige siden DB2 blev opfundet (så vidt vi ved), har man kunnet benytte DB2 direkte fra sine programmer vha. CAF-interfacet. I starten var CAF-interfacet stort set kun brugbart fra assembler, men nu er det gjort let tilgængeligt fra de mest gængse programmeringssprog på mainframen, såsom COBOL, PL/1 og C.

Før vi kaster os ud i, hvordan du bruger CAF i stedet for DSN, så er det på plads med en advarsel. Hvis man bruger CAF i steet for DSN, så skal man håndtere problematikker såsom valg af DB2-subsystem og valg af DB2-plan inde i programmet i stedet for som med DSN før og under opstart af programmet. Med CAF bliver dit program altså afhængigt af navngivne ressourcer. Det kan man selvfølgelig kode sig ud af, men så skal man først tage stilling til, hvordan det skal gøres med de heraf følgende problemer mht. standarder osv.

Nu til et eksempel skrevet i PL/1:

cafeks: PROC(parm) OPTIONS(MAIN) REORDER;
  DCL parm         CHAR(100);
  DCL caf_ssid      CHAR(4);
  DCL caf_function  CHAR(12);
  DCL caf_plan      CHAR(8);
  DCL caf_termop    CHAR(4);
  DCL caf_retcode   FIXED BIN(31);
  DCL caf_reascode  CHAR(4);

  caf_ssid = parm;
  caf_plan = 'CAFEKS';
  caf_retcode = 0;
  caf_reascode = 0;

  caf_function = 'OPEN';
  CALL dsnali( caf_function
            , caf_ssid, caf_plan
            , caf_retcode, caf_reascode
            );
  IF caf_retcode = 0
  THEN DO;
    /* Skriv resten af programmet her, som */
    /* om det foregik under DSN-kommandoen */
    caf_termop = 'SYNC';
    caf_function = 'CLOSE';
    CALL dsnali(caf_function, caf_termop);
  END;
  ELSE;
    SELECT(hex(caf_reascode));
      WHEN('00F30034')
        /* Plan ikke tilgængelig/findes ikke */
        ;
      WHEN('00F30006')
        /* Subsystem ikke tilgængeligt/findes ikke */
        ;
      OTHERWISE
        /* Anden fejl under OPEN */
        ;
    END;
END cafeks;

I stedet for kommentarerne indsætter du selv den kode, der passer på din installation. Vi har ikke vist funktionen HEX, som du selv skal kode eller gøre noget andet for at kunne teste på de angivne reasoncodes. Vi har udeladt CAF_RETCODE og CAF_REASCODE på CLOSE-kaldet, da det jo ikke får den store betydning for resten af programafviklingen i dette program om kaldet lykkes eller ej. Programmet terminerer under alle omstændigheder lige efter.

Når du linker et program, der benytter CAF, skal du huske at lave en INCLUDE af DSNALI i stedet for DSNELI, ellers forventer dine SQL-kald, at du kører under DSN-kommandoen. Når programmet i eksemplet er blevet til et LOAD-modul kan du fra JCL starte det med //CAFEKS  EXEC PGM=CAFEKS,PARM='/DB2', hvis dit DB2-subsystem hedder DB2.

En af de ting, vi overvejer at bruge CAF-interfacet til, er at accesse flere forskellige DB2-subsystemer under samme programafvikling. Man kan selvfølgelig også bruge CAF til at skifte DB2-plan undervejs. Når man først går i gang med disse ting, skal du nok først læse alt om CAF-interfacet i DB2 version 5 manualen Application Programming and SQL guide kapitel 6.6. Rigtig god fornøjelse.

Sidste uges tip        Tip oversigten