0

我有一个需要从 Teradata(使用 BTEQ)和 DB2 读取的 REXX 作业。目前,我可以让它从 Teradata 或 DB2 中读取,但不能同时从两者中读取。当我尝试从两者中读取时,Teradata 一个(首先运行)工作正常,但 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 读取时,它起作用了。

4

1 回答 1

2

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

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

1 是警告,-1 是错误。您可以在 DB2 Application Programming and SQL Guide 中查找它

打开 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 -说'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, , , , ,

例如,当两者一起使用时,可能没有足够的内存。

于 2009-12-02T01:12:14.867 回答