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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top