Min seneste oversættelse af et tip mindede mig om, at jeg helt har glemt at beskrive, hvordan du får hurtigere SQL INSERT/UPDATE/DELETE, som ikke eksekveres på samme måde som en SELECT. Forskellen i kodningen er ikke specielt stor, men jeg tager den lige med et eksempel:
/* 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 = 'INSERT INTO MYTABLE (MYKEYCOL, MYDATACOL) VALUES (?, ?)'
CALL SQLEXEC 0, "EXECSQL PREPARE S1 FROM :SQLSTMT"
SOMEDATA = 'FIRST SECOND THIRD FOURTH FIFTH'
DO ROWNO = 1 TO 5
MYKEYCOL = ROWNO
MYDATACOL = WORD(SOMEDATA, ROWNO)' ROW'
CALL SQLEXEC -803, "EXECSQL EXECUTE S1 USING :MYKEYCOL, :MYDATACOL"
END
CALL SQLEXEC 0, "EXECSQL COMMIT"
CALL SQLEXEC 0, "DISCONNECT"
RC=RXSUBCOM('DELETE','DSNREXX','DSNREXX')
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
I forhold til at eksekvere SELECT med REXX "hostvariable", så skal INTO-delen udelades på PREPARE. I stedet for at bruge OPEN/FETCH/CLOSE, skal du i stedet anvende EXECUTE. På EXECUTE tilføjes en USING-del, der ligesom USING på OPEN angiver de REXX-variable, der skal erstatte ? i selve SQL statementet i den angivne rækkefølge. UPDATE og DELETE udføres på præcis samme måde og der kan benyttes "hostvariable" både i SET-delen af UPDATE og i WHERE-delen.
Jeg har lavet nogle sammenligninger med traditionel statisk SQL for INSERT. Selve eksekveringstiden er direkte sammelignelig med statisk SQL. Det går simpelthen forrygende stærkt. Endnu en god grund til at kode REXX, så længe den overvejende del af eksekvering foregår i SQL.