Pergunta

Eu tenho um trabalho REXX que as necessidades de ler tanto Teradata (usando BTEQ) e DB2. No momento, eu posso começar a ler a partir Teradata ou DB2, mas não ambos. Quando eu tento ler tanto, a Teradata um (que é executado primeiro) funciona bem, mas a leitura DB2 dá um erro de RC (1) sobre a tentativa de abrir o cursor.

código para ler a partir Teradata (em grande parte copiado 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 ler a partir do 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

Eu suspeito que isso tem algo a ver com o meu uso de SYSPRINT e SYSIN. Alguém sabe como eu posso chegar a este trabalho?

Graças.

Editar

A pergunta como indicado foi realmente errado. Desculpas para não corrigir isso antes.

O que eu realmente tinha feito era ter este:

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

... seguido por uma pequena leitura do DB2, em seguida, seguido do código para ler a partir Teradata, seguido por mais código para ler a partir do DB2. Quando isso foi alterado para a leitura de Teradata antes de ter alguma coisa a ver com o DB2 em tudo, funcionou.

Foi útil?

Solução

Eu não acho que isso tem alguma coisa a ver com SYSPRINT ou SYSIN.

Eu acho que você está recebendo TSO RC = 1, não SQLCODE = 1 (porque não há nenhum SQLCODE de 1.

1 é um aviso, -1 é um erro. Você pode pesquisar sobre o assunto na Programação de Aplicações do DB2 e Guia SQL

Ligue TRACE R e executá-lo.

Existem variáveis ??(mostrado abaixo) que informações de exibição sobre o erro / aviso.

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 - dizer 'SQLERRD =' sqlerrd.1' , 'sqlerrd.2', 'sqlerrd.3', 'sqlerrd.4', ', sqlerrd.5' , 'sqlerrd.6
SQLERRD = 0, 0, 0, -1, 0, 0
32 - 'SQLWARN =' SAY 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 exemplo, pode ser que quando ambos são utilizados em conjunto, não há memória suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top