Problemas al usar REXX para acceder tanto a la salida de Teradata como a la salida de DB2

StackOverflow https://stackoverflow.com/questions/1403571

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un trabajo REXX que debo leer tanto de Teradata (usando BTEQ) como de DB2. En la actualidad, puedo leerlo desde Teradata o DB2, pero no desde ambos. Cuando trato de leer de ambos, el de Teradata (que se ejecuta primero) funciona bien, pero la lectura de DB2 da un error de RC (1) al intentar abrir el cursor.

Código para leer de Teradata (copiado en general 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

Código para leer 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

Sospecho que esto tiene algo que ver con mi uso de SYSPRINT y SYSIN. ¿Alguien sabe cómo puedo hacer que esto funcione?

Gracias.

Editar

La pregunta como se dijo en realidad era incorrecta. Disculpas por no corregir esto antes.

Lo que realmente había hecho era tener esto:

ADDRESS TSO "SUBCOM DSNREXX" 
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX') 
ADDRESS DSNREXX "CONNECT " subsys 

... seguido de una pequeña lectura de DB2, luego seguido del código para leer de Teradata, seguido de más códigos para leer de DB2. Cuando esto se cambió a la lectura de Teradata antes de tener que ver con DB2, funcionó.

¿Fue útil?

Solución

No creo que esto tenga nada que ver con SYSPRINT o SYSIN.

Creo que estás obteniendo TSO RC = 1, no SQLCODE = 1 (porque no hay un SQLCODE de 1.

1 es una advertencia, -1 es un error. Puede buscar esto en la Programación de aplicaciones de DB2 y Guía SQL

Active TRACE R y ejecútelo.

Hay variables (que se muestran a continuación) que muestran información sobre el error / advertencia.

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 - DIGA 'SQLERRD =' sqlerrd.1 ',' sqlerrd.2 ',' sqlerrd.3 ',' sqlerrd.4 ',',                  sqlerrd.5 ',' sqlerrd.6
SQLERRD = 0, 0, 0, -1, 0, 0
    32 - DIGA '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,,,,,,

Por ejemplo, podría ser que cuando ambos se usan juntos, no hay suficiente memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top