Probleme REXX mit Zugriff auf beide Teradata Ausgang und DB2 Ausgang
Frage
ich einen REXX Job haben, die von beiden Teradata lesen muss (mit BTEQ) und DB2. Derzeit kann ich es entweder von Teradata oder DB2 zu lesen, aber nicht beides. Wenn ich versuche, von beiden zu lesen, die Teradata ein (die ersten läuft) funktioniert gut, aber die DB2-Lese gibt einen Fehler von RC (1) beim Versuch, die Cursor zu öffnen.
-Code von Teradata (im Großen und Ganzen zu lesen, kopiert von 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 von DB2 zu lesen:
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
Ich vermute, dass dies etwas mit meiner Verwendung von SYSPRINT und SYSIN zu tun. Wer weiß, wie kann ich diese Arbeit bekommen?
Danke.
Bearbeiten
Die Frage angegeben, wie war eigentlich falsch. Entschuldigt nicht diese früher zu korrigieren.
Was hatte ich wirklich getan war haben dies:
ADDRESS TSO "SUBCOM DSNREXX"
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT " subsys
... von einer kleinen Lese von DB2 folgt, dann gefolgt von dem Code von Teradata zu lesen, um mehr Code gefolgt von DB2 zu lesen. Wenn dies auf das Lesen von Teradata geändert wurde, bevor irgendetwas mit DB2 überhaupt zu tun haben, es hat funktioniert.
Lösung
Ich glaube nicht, das etwas mit SYSPRINT oder SYSIN zu tun hat.
Ich denke, Sie bekommen TSO RC = 1, nicht SQLCODE = 1 (weil es keine SQLCODE von 1.
1 ist eine Warnung, -1 ein Fehler ist. Sie können dies in der DB2 Application Programming nachschlagen und SQL-Führer
Einschalten TRACE R und führen Sie es.
Es gibt Variablen (siehe unten), die Informationen über die Fehler / Warnung angezeigt werden soll.
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 - SAY 'SQLERRD =' sqlerrd.1' , 'sqlerrd.2', 'sqlerrd.3', 'sqlerrd.4', ',
sqlerrd.5' , ‚sqlerrd.6
SQLERRD = 0, 0, 0, -1, 0, 0
32 - SAY '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,,,,,
Zum Beispiel könnte es sein, dass, wenn beide zusammen verwendet werden, nicht genügend Speicher vorhanden ist.