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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top