MainframeSupports
tip uge 7/2007:

En af de ting, der irriterer mig ved DB2 er, at man ikke kan bruge tabeller fra forskellige DB2 subsystemer i samme SQL kald. Det forhindrer for eksempel en nem kopiering af data fra et subsystem til et andet med en INSERT INTO SELECT * FROM. En sådan kopiering involverer altid en UNLOAD efterfulgt af en LOAD utility. Det kan selvfølgelig klares med et job med to steps i, men i DB2 version 7 blev det faktisk muligt at lave det, der svarer til en INSERT INTO SELECT * FROM, med DB2s LOAD utility. Denne mulighed kalder IBM for DB2 cross-loader.

For at udføre en såkaldt cross-load utility kræves der en DRDA/DDF forbindelse mellem de involverede DB2 subsystemer. Derudover skal der være foretaget en BIND af en package kaldet DSNUT810 (i version 7 DSNUT710) på de involverede subsystemer. Denne BIND er normalt en del af DB2 installationen, så den bør være på plads. Og så skal du selvfølgelig lave et jobstep til at køre cross-load'en. Det kan se nogenlunde således ud:

//CROSLOAD EXEC PGM=DSNUTILB,PARM='SSID,MYJOB.CROSLOAD'
//SYSUT1   DD DISP=(MOD,DELETE,CATLG),SPACE=(CYL,(15,15),RLSE),
// DSN=&SYSUID..DB2LOAD.SYSUT1
//SORTOUT  DD DISP=(MOD,DELETE,CATLG),SPACE=(CYL,(15,15),RLSE),
// DSN=&SYSUID..DB2LOAD.SORTOUT
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  EXEC SQL
    DECLARE CROSLOAD CURSOR FOR
    SELECT * FROM DB2X.ANOTHER.TABLE
  ENDEXEC
  LOAD DATA INCURSOR(CROSLOAD) RESUME YES
  INTO TABLE MY.TABLE
/*

SSID i PARM= erstatter du med navnet på det subsystem, hvor tabellen MY.TABLE befinder sig. DB2X erstatter du med det navn, som skal benyttes for at accesse tabellen ANOTHER.TABLE på det DB2 subsystem, hvor ANOTHER.TABLE befinder sig. Det er en god ide, at ANOTHER.TABLE og MY.TABLE indeholder de samme kolonner defineret på samme måde, men det er ikke nogen forudsætning. Cross-load'eren vil kun overføre data mellem kolonner med samme navn. Hvis to kolonner med samme navn ikke har samme definition, så vil DB2 forsøge at konvertere og hvis det ikke kan lade sig gøre vil steppet gå galt. Man kan benytte AS i SELECT delen for at navngive kolonner ens, hvis de er navngivet forskelligt. Muligheden for at omdøbe kolonner med AS gør det muligt at lave alle mulige SELECT statements inklusive JOINS.

Muligheden for at udføre SQL kald som en kommando i DSNUTILB begrænser sig ikke til SELECT. Du kan udføre alle mulige SQL kald, eksempelvis UPDATE og INSERT. Det kan du benytte til at opdatere en tabel med oplysninger om, at en utility er kørt eller andre interessante oplysninger.

I selve LOAD utility'en kan du selvfølgelig stadig benytte alle de andre normale options. Du kan eksempelvis skrive REPLACE i stedet for RESUME YES. Læs mere om mulighederne i Utility Guide and Reference. Linket er til DB2 version 8 manualen.

Forrige danske tip        Last tip in english        Tip oversigten