En af udfordringerne ved at bruge SQL i REXX er, at det performer ret dårligt. Jeg har traditionelt bygget det færdige SQL statement op i en variabel, som angivet i tippet i Uge 29/2015. Det går også fint, hvis man kun skal eksekvere det samme SQL statement nogle få gange med forskellige "hostvariabel" værdier. Det kunne jo være dejligt, hvis man kunne benytte noget, der ligner hostvariable i det færdige SQL. Så slap man for at bygge SQL'et hver gang, og måske fik man også performance, der ligner statisk SQL i COBOL eller PL/I.
Og det er faktisk muligt at benytte hostvariable. Det fungerer en lille smule anderledes end med statisk SQL, men det er utrolig nemt. Se bare her:
/* REXX */ SUBCOM DSNREXX IF RC THEN X=RXSUBCOM('ADD','DSNREXX','DSNREXX') CALL SQLEXEC 0, "CONNECT MYDB" CALL SQLEXEC 0, "EXECSQL SET CURRENT PACKAGESET='DSNREXCS'" SQLSTMT = 'SELECT CREATOR, NAME', 'FROM SYSIBM.SYSTABLES', 'WHERE DBNAME= ? AND TSNAME= ?' CALL SQLEXEC 0, "EXECSQL DECLARE C1 CURSOR FOR S1" CALL SQLEXEC 98, "EXECSQL PREPARE S1 INTO :OUTSQLDA FROM :SQLSTMT" CALL GETTABLENAME 'DSNDB06', 'SYSCOPY' IF CREATOR <> '' THEN SAY CREATOR'.'NAME CALL GETTABLENAME 'DSNDB06', 'SYSGPAUT' IF CREATOR <> '' THEN SAY CREATOR'.'NAME CALL SQLEXEC 0, "DISCONNECT" RC=RXSUBCOM('DELETE','DSNREXX','DSNREXX') EXIT GETTABLENAME: ARG DBNAME, TSNAME CALL SQLEXEC 0, "EXECSQL OPEN C1 USING :DBNAME,:TSNAME" CALL SQLEXEC 100, "EXECSQL FETCH C1 USING DESCRIPTOR :OUTSQLDA" IF SQLCODE = 0 THEN DO CREATOR = OUTSQLDA.1.SQLDATA NAME = OUTSQLDA.2.SQLDATA END ELSE CREATOR = '' CALL SQLEXEC 0, "EXECSQL CLOSE C1" EXIT SQLEXEC: ARG ACCEPT, STMT ADDRESS DSNREXX STMT IF SQLCODE <> 0 & SQLCODE <> ACCEPT THEN IF WORD(STMT,1) = 'EXECSQL' THEN SAY WORD(STMT,2)': SQLCODE='SQLCODE ELSE SAY WORD(STMT,1)': SQLCODE='SQLCODE RETURN
Det meste ligner REXX'en fra det tidligere tip, men der er en væsentlig forskel. PREPARE udføres kun een gang og opbygningen af SQL'et udføres også kun een gang. I det opbyggede SQL angives ? der, hvor en hostvariabel normalt benyttes. OPEN udføres for hvert sæt af hostvariable, der skal benyttes. På OPEN er der tilføjet en USING og efter USING angives de REXX-variable, der skal benyttes som hostvariable der, hvor der er angivet ? i selve SQL'et. Første hostvariabel erstatter første ? og så fremdeles.
Så længe du (som i denne simple REXX) kun udfører SQL-kaldet nogle få gange, vil du ikke mærke den store forskel, men bare efter en 100 kald vil du tydeligt mærke forskellen. Så nu er der en grund mindre til at benytte COBOL eller PL/I.