MainframeSupports
tip uge 34/2007:

For nylig blev jeg spurgt om, hvordan man lettest muligt fjernede efterstillede blanke i PL/I. Det viste sig, at de blanke skulle fjernes, fordi de ikke skulle fylde op i en DB2 VARCHAR kolonne. Det er en gammel problemstilling, jeg stiftede bekendtskab med for mange år siden. Der findes sandsynligvis rigtig mange VARCHAR kolonner, der er fyldt til randen med efterstillede blanke, og dem gemmer DB2 selvfølgelig.

Hvis man vil have det nødvendige udbytte af at have en VARCHAR kolonne, så skal man huske at længden skal være angivet korrekt inden man laver sin INSERT eller UPDATE af en VARCHAR. For at få den rigtige længde kan man lave en lille rutine, der tæller baglæns fra den maksimale længde af ens VARCHAR hostvariabel indtil den møder det første ikke-blanke tegn. Men så slog det mig, at DB2 allerede i version 6 (vistnok) fik en STRIP funktion. En version eller to senere fik DB2 så en RTRIM funktion, der svarer til en STRIP, der kun tager sig af at fjerne efterstillede blanke. STRIP kan både fjerne efterstillede og foranstille tegn og ikke bare blank-tegn.

I stedet for at kode fjernelsen af efterstillede blanke i sit program kan man simpelthen overlade opgaven til DB2. Antag tabel STRIPPED med kolonnerne STRIPKEY CHAR(8) og STRIPDATA VARCHAR(254). En traditionel INSERT i STRIPPED ser således ud:

INSERT INTO STRIPPED (STRIPKEY, STRIPDATA)
VALUES(:stripKey, :stripData)

Men det er faktisk meget fiksere at benytte:

INSERT INTO STRIPPED (STRIPKEY, STRIPDATA)
VALUES(:stripKey, RTRIM(:stripData))

At benytte RTRIM på ovennævnte måde har både den fordel, at vi ikke behøver at kode fjernelsen af de efterstillede blanke selv, men også, at vi ikke behøver at bekymre os så meget om datatypen for hostvariablen stripData, bare den kan indeholde tegn og har en længde mindre end eller lig 254 tegn i dette eksempel. Faktisk er jeg lidt rystet over, at jeg ikke har tænkt over dette tip for længe siden.

Forrige danske tip        Last tip in english        Tip oversigten