MainframeSupports
tip uge 29/2009:

I det forrige danske tip skrev jeg om at gøre ASCII filer læsbare i ISPF. DB2 vil under normale omstændigheder sørge for at konvertere ASCII eller UNICODE data, så de er læsbare. Tag eksempelvis DB2 kataloget i DB2 version 8 og efterfølgende versioner. Det er gemt som UNICODE, men når vi laver en SELECT mod en tabel i DB2 kataloget, så får vi vist data i læsbart format.

Desværre er det ikke altid, at en DB2 tabel/kolonne er defineret på en sådan måde, at DB2 selv automatisk sørger for at konvertere data, så de fremstår som læsbare. I første omgang troede jeg så, at der var en funktion til at konvertere med. Forestil dig, at du ved, at en kolonne indeholder ASCII eller UNICODE data, men når du laver en SELECT af denne kolonne på mainframen, så konverterer DB2 ikke, og dermed er data i kolonnen rimeligt ulæselige, med mindre du kan ASCII/UNICODE til EBCDIC konvertere inde i hovedet. Det kan jeg ikke. Desværre findes der umiddelbart ikke en funktion til at konvertere med, men det første du kan prøve er CHAR-funktionen:

SELECT CHAR(myAsciiColumn)
FROM myAsciiTable
WHERE ...

Hvor MYASCIICOLUMN indeholder ASCII eller UNICODE data. Hvis dette trick ikke virker, så er du nødt til at anvende CAST funktionen, som ikke er en funktion i traditionel forstand. CAST er en måde at omdefinere en kolonne på midlertidigt i et SQL-kald. Prøv eksempelvis:

SELECT CAST (myAsciiColumn as char(254) CCSID ASCII)
FROM myAsciiTable
WHERE ...

Dette SQL-kald vil tvinge DB2 til at fortolke indholdet af MYASCIICOLUMN som værende i ASCII format og i øvrigt være 254 tegn langt. Desværre er det langt fra sikkert, at ovenstående vil virke. Det afhænger nemlig også af, hvordan kolonnen rent faktisk er defineret. Hvis den eksempelvis er defineret som FOR BIT DATA, så vil ovenstående ikke gøre nogen forskel. Så skal du i stedet prøve:

SELECT CAST (myAsciiColumn as varchar(200) FOR MIXED DATA)
FROM myAsciiTable
WHERE ...

Nu tvinges DB2 til at betragte indholdet af kolonnen som almindelige tegn i stedet for en gang bit-suppe. Læg mærke til, at du kan justere på definitionen af den resulterende kolonne næsten efter forgodtbefindende. Her valgte jeg at kalde den VARCHAR(200) i stedet. Hvilken længde kolonnen har på tabellen spiller ingen større rolle. Den skal dog være en eller anden form for CHAR kolonne.

Når du benytter CAST til at gøre DB2 data læsbare med, så kan du risikere at få en SQLCODE -331. Det skyldes, at DB2 ikke kan oversætte et tegn på DB2-tabellen korrekt. Denne fejl kan undgås ved at putte hele CAST funktionen ind i en CHAR funktion:

SELECT CHAR(CAST (myAsciiColumn as varchar(1000) FOR MIXED DATA))
FROM myAsciiTable
WHERE ...

CHAR funktionen har dog den ulempe, at den afkorter til 255 tegn, uanset hvad kolonnen er defineret som og hvilken længde, du angiver i din CAST.

Desværre kan jeg ikke komme med en entydig løsning på, hvordan du får konverteret forskellige formater til læsbare tegn. Hvis ovenstående ikke hjælper dig, så må du forfølge linket til CAST funktionen og læse om de øvrige muligheder, der er. Hvis du finder en generel løsning, så vil jeg gerne høre om den.

Forrige danske tip        Last tip in english        Tip oversigten