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

从Teradata读取的代码(大体上复制自 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

从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

我怀疑这与我使用SYSPRINT和SYSIN有关。任何人都知道如何让这个工作?

感谢。

修改

陈述的问题实际上是错误的。抱歉不要早点纠正这个问题。

我真正做的是:

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

...然后是从DB2读取的一小部分,然后是从Teradata读取的代码,接着是从DB2读取的更多代码。

在完全没有与DB2有任何关系之前,首先将其改为从Teradata读取,但它确实有效。

有帮助吗?

解决方案

我认为这与SYSPRINT或SYSIN没有任何关系。

我认为你得到TSO RC = 1,而不是SQLCODE = 1(因为没有SQLCODE为1。

1是警告,-1是错误。您可以在DB2 Application Programming中查看 和SQL指南

启用TRACE R并运行它。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top