Problèmes d'utilisation de REXX pour accéder à la fois à la sortie Teradata et à la sortie DB2
Question
J'ai un travail REXX qui doit être lu à partir de Teradata (à l'aide de BTEQ) et de DB2. À l'heure actuelle, je peux le lire soit à partir de Teradata, soit à partir de DB2, mais pas les deux. Lorsque j'essaie de lire dans les deux cas, celui de Teradata (qui s'exécute en premier) fonctionne correctement, mais la lecture de DB2 génère une erreur de type RC (1) lors de la tentative d'ouverture du curseur.
Code à lire à partir de Teradata (généralement copié à partir de http: //www.teradataforum. com / teradata / 20040928_131203.htm ):
ADDRESS TSO "DELETE BLAH.TEMP"
"ALLOC FI(SYSPRINT) DA(BLAH.TEMP) NEW CATALOG SP(10 10) TR RELEASE",
"UNIT(SYSDA) RECFM(F B A) LRECL(133) BLKSIZE(0) REUSE"
"ATTRIB FBATTR LRECL(220)"
"ALLOC F(SYSIN) UNIT(VIO) TRACKS SPACE(10,10) USING(FBATTR)"
/* Set up BTEQ script */
QUEUE ".RUN FILE=LOGON"
QUEUE "SELECT COLUMN1 FROM TABLE1;"
/* Run BTEQ script */
"EXECIO * DISKW SYSIN (FINIS"
"CALL 'SYS3.TDP.APPLOAD(BTQMAIN)'"; bteq_rc = rc
"FREE FI(SYSPRINT SYSIN)"
/* Read and parse BTEQ output */
"EXECIO * DISKR SYSPRINT (STEM BTEQOUT. FINIS"
DO I = 1 to BTEQOUT.0
...
END
Code à lire à partir de DB2:
ADDRESS TSO "SUBCOM DSNREXX"
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT " subsys
sqlQuery = "SELECT COLUMN2 FROM TABLE2;"
ADDRESS DSNREXX "EXECSQL DECLARE C001 CURSOR FOR S001"
IF SQLCODE <> 0 THEN DO
SAY 'DECLARE C001 SQLCODE = ' SQLCODE
EXIT 12
END
ADDRESS DSNREXX "EXECSQL PREPARE S001 FROM :sqlQuery"
IF SQLCODE <> 0 THEN DO
SAY 'PREPARE S001 SQLCODE = ' SQLCODE SQLERROR
EXIT 12
END
ADDRESS DSNREXX "EXECSQL OPEN C001"
IF SQLCODE <> 0 THEN DO
SAY 'OPEN C001 SQLCODE = ' SQLCODE
EXIT 12
END
ADDRESS DSNREXX "EXECSQL FETCH C001 INTO :col2"
IF SQLCODE <> 0 THEN DO
SAY 'FETCH C001 SQLCODE = ' SQLCODE
EXIT 12
END
Je suppose que cela a quelque chose à voir avec mon utilisation de SYSPRINT et SYSIN. Quelqu'un sait comment je peux le faire fonctionner?
Merci.
Modifier
La question posée était en réalité erronée. Toutes mes excuses pour ne pas avoir corrigé cela plus tôt.
Ce que j’avais vraiment fait, c’est:
ADDRESS TSO "SUBCOM DSNREXX"
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT " subsys
... suivi d'une petite lecture à partir de DB2, suivi du code à lire à partir de Teradata, suivi d'un code supplémentaire à lire à partir de DB2. Lorsque cela a été modifié en lecture de Teradata avant d’avoir quoi que ce soit à faire avec DB2, cela a fonctionné.
La solution
Je pense que cela n’a rien à voir avec SYSPRINT ou SYSIN.
Je pense que vous obtenez TSO RC = 1, pas SQLCODE = 1 (car il n’existe pas de SQLCODE de 1.
1 est un avertissement, -1 est une erreur. Vous pouvez le rechercher dans la programmation d'applications DB2. et Guide SQL
Allumez TRACE R et exécutez-le.
Certaines variables (illustrées ci-dessous) affichent des informations sur l'erreur / l'avertissement.
22 *-* ADDRESS DSNREXX "EXECSQL OPEN C1"
>>> "EXECSQL OPEN C1"
+++ RC(1) +++
23 *-* IF SQLCODE <> 0
28 *-* SAY 'SQLSTATE='sqlstate', SQLERRMC='sqlerrmc', SQLERRP='sqlerrp
SQLSTATE = 00000, SQLERRMC =, SQLERRP = DSN
29 - DITES 'SQLERRD =' sqlerrd.1 ',' sqlerrd.2 ',' sqlerrd.3 ',' sqlerrd.4 ',',
sqlerrd.5 ',' sqlerrd.6
SQLERRD = 0, 0, 0, -1, 0, 0
32 - DITES 'SQLWARN =' sqlwarn.0 ',' sqlwarn.1 ',' sqlwarn.2 ',' sqlwarn.3 ',',
sqlwarn.4 ',' sqlwarn.5 ',' sqlwarn.6 ',' sqlwarn.7 ',',
sqlwarn.8 ',' sqlwarn.9 ',' sqlwarn.10
SQLWARN =, N,,, 2,,,,
Par exemple, il se peut que, lorsque les deux sont utilisés ensemble, la mémoire est insuffisante.