Проблемы с использованием REXX для доступа как к выводу Teradata, так и к выводу DB2.

StackOverflow https://stackoverflow.com/questions/1403571

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть задание 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, , , , ,

Например, может случиться так, что при совместном использовании обоих не хватает памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top