Problemi nell'utilizzo di REXX per accedere sia all'output Teradata che all'output DB2
Domanda
Ho un lavoro REXX che deve leggere sia da Teradata (usando BTEQ) sia da DB2. Al momento, posso farlo leggere da Teradata o DB2, ma non da entrambi. Quando provo a leggere da entrambi, quello di Teradata (che viene eseguito per primo) funziona correttamente, ma la lettura di DB2 fornisce un errore di RC (1) nel tentativo di aprire il cursore.
Codice da leggere da Teradata (di solito copiato da 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
Codice da leggere da 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
Sospetto che ciò abbia a che fare con il mio uso di SYSPRINT e SYSIN. Qualcuno sa come posso farlo funzionare?
Grazie.
Modifica
La domanda come affermata era effettivamente sbagliata. Ci scusiamo per non averlo corretto in precedenza.
Quello che avevo davvero fatto era avere questo:
ADDRESS TSO "SUBCOM DSNREXX"
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX')
ADDRESS DSNREXX "CONNECT " subsys
... seguito da una piccola lettura da DB2, quindi dal codice per leggere da Teradata, seguito da altro codice da leggere da DB2. Quando questo è stato modificato in lettura da Teradata prima di avere qualcosa a che fare con DB2, ha funzionato.
Soluzione
Non credo che ciò abbia a che fare con SYSPRINT o SYSIN.
Penso che stai ottenendo TSO RC = 1, non SQLCODE = 1 (perché non esiste SQLCODE di 1.
1 è un avvertimento, -1 è un errore. Puoi cercarlo nella programmazione dell'applicazione DB2 e Guida SQL
Attiva TRACE R ed eseguilo.
Esistono variabili (mostrate di seguito) che visualizzano informazioni sull'errore / avviso.
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 - DIRE 'SQLERRD =' sqlerrd.1 ',' sqlerrd.2 ',' sqlerrd.3 ',' sqlerrd.4 ',',
sqlerrd.5 ',' sqlerrd.6
SQLERRD = 0, 0, 0, -1, 0, 0
32 - DIRE '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,,,,,
Ad esempio, potrebbe essere che quando entrambi vengono utilizzati insieme, non c'è memoria sufficiente.