
Ved Renden 31 2870 Dyssegaard Tel. +45 23 34 54 43
| 
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
|