MainframeSupports
tip uge 41/2014:

Med de nyeste versioner af DB2 er det muligt at lave alskens konverteringer mellem forskellige dataformater. Det kan du primært gøre med funktionen CAST. En helt speciel slags konvertering kræver dog, at CAST bliver assisteret af forskellige andre funktioner. Dette tip handler om, hvordan du kan konvertere en decimal værdi gemt i en almindelig tegnstreng til en DB2 decimal.

Nu er det jo forholdsvis sjældent, at en decimal værdi (en packed decimal i PLI eller i COBOL kendt som en COMP-3) sniger sig ind i en tegnstreng. Men det sker indimellem i såkaldte RESTART tabeller, hvor man gemmer, hvor langt man er nået i sin behandling, hvis man kører med COMMIT intervaller. Det kan også være i tabeller, hvor man af andre årsager gemmer en datastruktur indeholdende decimal felter i en tegnstreng.

I det følgende eksempel ønsker jeg at konvertere en decimal(15), der er placeret i en tegnstreng fra position 9. En decimal(15) fylder som bekendt 8 bytes, og så ser konverteringen således ud:

SELECT CAST(SUBSTR(HEX(SUBSTR(RESTARTDATA,9,8)),1,15) AS DECIMAL(15))
FROM RESTARTTABLE
WHERE JOBNAME = 'MYJOB'

RESTARTDATA er enten en CHAR eller en VARCHAR. Den inderste SUBSTR returnerer den interne repræsentation af decimal(15) feltet. Med HEX funktionen laves den interne repræsentation om til en tegnstreng bestående af selve cifrene i de 15 første tegn og i det sidste tegn er fortegnet gemt. Fortegnet er typisk C for + og D for -. I ovenstående eksempel tager jeg således ikke hensyn til fortegnet og resultatet er altid positivt.

I eksemplet konverterer jeg værdien i en SELECT, hvor jeg egentlig godt kunne have udeladt CAST for at vise værdien. Så bliver den bare vist med foranstillede nuller. Hvis jeg ønsker at bruge værdien i WHERE-delen for at slå op med den via et index på en kolonne i samme tabel eller en anden tabel, så vil det være en rigtig god ide at benytte CAST funktionen, for så har DB2 bedre mulighed for at gøre brug af et index ved opslag.

Forrige danske tip        Last tip in english        Tip oversigten