MainframeSupports
tip uge 23/1999:

For at konstatere om en given række findes i en DB2-tabel benytter man SQL-kaldet SELECT. SELECT returnerer een eller flere rækker. Men hvad hvis nu man kun er interesseret i om der er nogen rækker, der opfylder ens WHERE betingelse og ellers er ligeglad med indholdet i disse rækker. Det handler ugens tip om.

Der findes faktisk en måde at opnå det ønskede resultat på. Man kan nemlig anvende SQL-kaldet UPDATE i stedet for. Vi skal for en god ordens skyld bemærke, at UPDATE har visse side-effekter, såsom at låse-metoden er mere restriktiv end med en SELECT og desuden er der en del begrænsninger i forhold til en SELECT. Det er f.eks. ikke lige til at joine, da UPDATE kun kan ske på een tabel. Fordelen er, at man i et program ikke skal til at opfinde en host-variabel til lejligheden og man slipper for at lave DECLARE CURSOR eller for at teste for SQLCODE -811.

Vi har en tabel kaldet MIN_TABEL med kolonnerne MIT_NR og NOGET_INFORMATION. Vi ønsker at finde ud af om rækken med MIT_NR = 3 findes:
 

UPDATE MIN_TABEL
SET MIT_NR = MIT_NR
WHERE MIT_NR = 3
Hvis der findes en eller flere rækker med MIT_NR = 3, så returneres SQLCODE 0 ellers returneres SQLCODE 100. Faktisk så er DB2 designet til at udføre ovenstående SQL-kald så effektivt som muligt. Normalt vil en UPDATE medføre en del logning, men DB2 lurer, at MIT_NR ikke ændrer værdi, så derfor er der ingen grund til at logge noget. Det havde ikke gjort nogen forskel, hvis man havde skrevet SET MIT_NR = 3, da det jo er samme værdi, som den har i forvejen.

Hvis vi antager, at der er et indeks på MIT_NR i ovenstående eksempel, så vil DB2 både læse data-delen og indeks-delen, hvorimod en SELECT kun vil læse indeks-delen. Man skal altså anvende ugens tip med omtanke.

Sidste uges tip        Tip oversigten