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.