MainframeSupports
tip uge 20/2010:

En af de udfordringer, som mange DB2-hajer tumler med, er at kunne returnere nummeret på den aktuelle række som en del af resultatet. Den første række får nummer 1, den næste nummer 2 og så fremdeles. I et applikationsprogram kan man selvfølgelig lave sin egen tæller, men det er ulige sværere i mange af de forskellige værktøjer, der kan udføre dynamisk SQL.

Jeg faldt for nylig over den såkaldte SEQUENCE i DB2 (en af de mange funktionaliteter, som ORACLE kom med lang tid før DB2, ligesom rekursiv SQL). Den nemmeste måde at oprette en SEQUENCE er med en CREATE SEQUENCE MYSEQ. Du erstatter selv MYSEQ med det navn, du foretrækker. Herefter laver du for eksempel en:

SELECT NEXT VALUE FOR MYSEQ, X.*
FROM SYSIBM.SYSDATABASE X
WHERE NAME LIKE 'DSN%'

Nu vil første kolonne i resultatet være et fortløbende nummber. Sværere er det altså ikke. Men filmen knækker allerede ved næste SQL-kald, for så får første række nummeret efter den sidste række i det forrige resultat. Det kan heldigvis kureres med en ALTER SEQUENCE MYSEQ RESTART WITH 1. Så begynder numrene forfra igen. Næste udfordring kommer, når du tilføjer ORDER BY, GROUP BY eller DISTINCT. Så får du SQLCODE -348, som beskriver alle de tilfælde, hvor du ikke kan anvende dette tip.

Hvis du gerne vil have en funktion, der virker som NEXT VALUE FOR MYSEQ uden dennes begrænsninger, så vil jeg anbefale dig at prøve med en User Defined Function (UDF). I dette tip har jeg angivet den kortest mulige udgave af brugen af en SEQUENCE. Du kan selvfølgelig læse mere i SQL Reference. Her vil du bemærke revisionsmarkeringerne i venste side, som indikerer, at SEQUENCE virker for DB2 version 8 og fremefter.

Forrige danske tip        Last tip in english        Tip oversigten