MainframeSupports
tip week 11/2020:

Translating my previous tip reminded me about having forgotten to describe how to get faster SQL INSERT/UPDATE/DELETE performance in REXX as these SQL statements are not executed in the same way as a SELECT. The way to code it does not differ much from SELECT, but I will show you an example anyway:

/* 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 

Compared to executing SELECT using REXX "hostvariables" the INTO part should be omitted on PREPARE. Instead of using OPEN/FETCH/CLOSE you should use EXECUTE. On EXECUTE you add a USING part which specifies the REXX-variables to replace ? in the SQL statement text in the given order, just like USING on OPEN. UPDATE and DELETE works in exactly the same way and "hostvariables" can be used in both the SET part of UPDATE and in the WHERE clause.

I have made some comparisons to traditional static SQL for INSERT. The execution time is directly comparable with static SQL. It simply executes extremely fast. Yet another reason to use REXX as long as the large part of the execution is done in SQL.

Previous tip in english        Forrige danske tip        Tip list