MainframeSupports
tip uge 31/2004:

For ca. to et halvt år siden skrev jeg et tip om global temporary tables i DB2. Dette tip gennemgår desværre kun de global temporary tables, man opretter med CREATE. Lige siden DB2 version 6 har man nemlig også kunnet lave global temporary tables med DECLARE. Forskellen er, at DECLARE oprettede temporary tables kun eksisterer i DB2 fra DECLARE tidspunktet og ind til DB2 thread'en lukkes, altså normalt så længe som et program kører. Herefter vil alle spor af tabellen være forsvundet som dug for solen.

Jeg vil til enhver tid anbefale brugen af DECLARE GLOBAL TEMPORARY TABLE i stedet for CREATE GLOBAL TEMPORARY TABLE. Før du kaster dig ud i brugen af DECLARE varianten er der et par ting, der er gode at vide. For det første er det ikke sikkert, at DECLARE varianten virker på dit DB2 subsystem. Jeg har en lumsk fornemmelse af, at det er muligt i DB2 opsætningen at forhindre DECLARE varianten i at fungere. Det har dog virket på alle de installationer, hvor jeg har prøvet. For det andet, så skal man benytte creatoren SESSION for at referere til den DECLARE'de tabel i andre SQL-kald. Det kan give problemer i statisk SQL blandt andet fordi at SQL-kald, der refererer til en DECLARE't tabel først bliver bindet på eksekveringstidspunktet, men også fordi at din installation måske ikke tillader anvendelsen af fuldt kvalificerede tabelnavne i programmerne. I dynamisk SQL (SPUFI, QMF, SAS, DSNTIAUL og så videre) er der til gengæld ingen problemer.

En af de vigtigste fordele ved at bruge DECLARE varianten er, at data i tabellen kan overleve COMMIT og ROLLBACK efter de normale regler herfor. Her er et lille eksempel:

DECLARE GLOBAL TEMPORARY TABLE MYTABLE
(MYCOLUMN CHAR(8)) ON COMMIT PRESERVE ROWS;
INSERT INTO SESSION.MYTABLE VALUES('ROWNO. 1');
INSERT INTO SESSION.MYTABLE VALUES('ROWNO. 2');
COMMIT;
INSERT INTO SESSION.MYTABLE VALUES('ROWNO. 3');
SELECT * FROM SESSION.MYTABLE;

Den afsluttende SELECT vil hente alle tre rækker. Hvis ON COMMIT PRESERVE ROWS udelades, så vil den afsluttende SELECT kun hente ROWNO. 3, da data i tabellen i dette tilfælde ikke overlever COMMIT. Der er også en masse andre muligheder med DECLARE varianten, som du kan læse mere om i SQL reference.

Forrige danske tip        Last tip in english        Tip oversigten