Проблемы с использованием REXX для доступа как к выводу Teradata, так и к выводу DB2.
Вопрос
У меня есть задание REXX, которое необходимо читать как из Teradata (с использованием BTEQ), так и из DB2.В настоящее время я могу заставить его читать либо из 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.Когда это было изменено на чтение из Teradata, прежде чем вообще иметь какое-либо отношение к DB2, это сработало.
Решение
Я не думаю, что это имеет какое-либо отношение к SYSPRINT или SYSIN.
Я думаю, вы получаете TSO RC = 1, а не SQLCODE = 1 (поскольку SQLCODE, равный 1, не существует.
1 — предупреждение, -1 — ошибка.Вы можете посмотреть это в прикладном программировании DB2 и руководстве 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 - Скажите '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, , , , ,
Например, может случиться так, что при совместном использовании обоих не хватает памяти.