使用REXX访问Teradata输出和DB2输出时出现问题

使用REXX访问Teradata输出和DB2输出时出现问题,db2,mainframe,teradata,rexx,Db2,Mainframe,Teradata,Rexx,我有一个REXX作业,需要同时读取Teradata(使用BTEQ)和DB2。目前,我可以从Teradata或DB2中读取它,但不能同时从两者中读取。当我尝试从两者中读取时,Teradata one(首先运行)可以正常工作,但是DB2读取在尝试打开游标时给出了一个错误RC(1) 从Teradata读取的代码(大体上是从中复制的): 要从DB2读取的代码: ADDRESS TSO "SUBCOM DSNREXX" IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX'

我有一个REXX作业,需要同时读取Teradata(使用BTEQ)和DB2。目前,我可以从Teradata或DB2中读取它,但不能同时从两者中读取。当我尝试从两者中读取时,Teradata one(首先运行)可以正常工作,但是DB2读取在尝试打开游标时给出了一个错误RC(1)

从Teradata读取的代码(大体上是从中复制的):

要从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

…然后是从DB2读取的少量代码,然后是从Teradata读取的代码,然后是从DB2读取的更多代码。在与DB2完全相关之前,将其更改为首先从Teradata读取时,它起了作用。

我认为这与SYSPRINT或SYSIN无关

我认为您得到的是TSO RC=1,而不是SQLCODE=1(因为没有1的SQLCODE)

1是一个警告,-1是一个错误 和SQL指南

打开tracer并运行它

有一些变量(如下所示)显示有关错误/警告的信息

22 *-* ADDRESS DSNREXX "EXECSQL OPEN C1"                                  
   >>>   "EXECSQL OPEN C1"                                                
   +++ RC(1) +++                                                          
23 *-* IF SQLCODE <> 0                                                    
28 *-* SAY 'SQLSTATE='sqlstate', SQLERRMC='sqlerrmc', SQLERRP='sqlerrp    
22*-*地址DSNREXX“EXECSQL OPEN C1”
>>>“EXECSQL打开C1”
+++RC(1)+++
23*-*如果SQL代码为0
28*-*说'SQLSTATE='SQLSTATE',SQLERRMC='SQLERRMC',SQLERRP='SQLERRP'
SQLSTATE=00000,SQLERRMC=,SQLERRP=DSN
29-说'SQLERRD='SQLERRD.1','SQLERRD.2','SQLERRD.3','SQLERRD.4',', sqlerrd.5','sqlerrd.6
SQLERRD=0,0,0,-1,0,0
32-说'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


例如,当两者一起使用时,可能内存不足。

谢谢您的回答。我实际上已经对此进行了修复(请参阅编辑以获取解释)前一段时间,但忘了发布它。但是,我仍然几乎不知道旧的实现为什么不起作用。如果您能帮助澄清,我会将此标记为正确答案。我认为您必须转储那些SQLWARN.1 SQLWARN.2等字段,如果您收到警告,找出填写的是哪一个,并通过挖掘手册来解决该错误。它可能与特定的查询有关,当您重新编写程序时,查询略有不同,您使用了不同的游标或其他东西。
ADDRESS TSO "SUBCOM DSNREXX" 
IF RC THEN rcDB2 = RXSUBCOM('ADD','DSNREXX','DSNREXX') 
ADDRESS DSNREXX "CONNECT " subsys 
22 *-* ADDRESS DSNREXX "EXECSQL OPEN C1"                                  
   >>>   "EXECSQL OPEN C1"                                                
   +++ RC(1) +++                                                          
23 *-* IF SQLCODE <> 0                                                    
28 *-* SAY 'SQLSTATE='sqlstate', SQLERRMC='sqlerrmc', SQLERRP='sqlerrp