MainframeSupports
tip uge 21/2019:

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.

Forrige danske tip        Last tip in english        Tip oversigten