MainframeSupports
tip uge 28/2018:

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.

Forrige danske tip        Last tip in english        Tip oversigten