En af de smarte ting i QMF er muligheden for at angive en slags hostvariabel med en såkaldt &variabel, for eksempel SELECT * FROM MYTABLE WHERE MYKEY = &KEYVALUE. Dette vil få QMF til at vise en popup, hvor du kan indtaste værdien af KEYVALUE og derefter få kørt SQL-kaldet med denne værdi. Denne mulighed eksisterer ikke i SPUFI eller andre værktøjer som DSNTIAUL eller DSNTEP2 og det har faktisk irriterert mig længe.
Så en dag kom jeg i tanke om, at WITH måske kunne anvendes til formålet. Jeg har kun brugt WITH i forbindelse med rekursivt SQL og derfor ikke tænkt nærmere over andre anvendelsesmuligheder, men følgende kan bruges:
WITH PARM (KEYVALUE) AS ( SELECT 'A' FROM SYSIBM.SYSDUMMY1 ) SELECT * FROM MYTABLE, PARM WHERE MYKEY = PARM.KEYVALUE
WITH delen af et SELECT statement opbygger en til flere resultat-tabeller, som kan benyttes i den afsluttende SELECT. Jeg har kun brug for en enkelt hostvariabel/parameter i den afsluttende SELECT, så tricket går ud på at opbygge en tabel (PARM) med en enkelt række (SYSIBM.SYSDUMMY1) og kolonne (KEYVALUE) og tildele denne kolonne i rækken en værdi ('A'). Hvis jeg skal eksekvere SQL statementet igen med en anden værdi, så retter jeg denne i den øverste SELECT liste.
For at kunne benytte hostvariablen/parameteren i den afsluttende SELECT skal jeg huske at tage PARM tabellen med i FROM listen. Hvis selve SELECT delen kræver flere forskellige hostvariable/parametre, så kan jeg tilføje parameternavnet efter KEYVALUE adskilt med et komma og tilføje den aktuelle værdi i den første SELECT liste. Når jeg eksekverer SQL'et med SPUFI mange gange skal jeg kun bekymre mig om at have de rigtige værdier i den øverste SELECT liste. Uanset hvor kompliceret det efterfølgende SELECT statement er, så skal jeg ikke bekymre mig om at finde de værdier, jeg gerne vil erstatte. Endnu bedre bliver det, hvis den samme værdi genbruges flere steder i selve SELECT statementet. Her kan jeg bare genbruge PARM.parameternavn og dermed være sikker på, at værdien benyttes alle de rigtige steder.