Проблемы с использованием REXX для доступа к выводу Teradata и выводу DB2 - PullRequest
0 голосов
/ 10 сентября 2009

У меня есть задание REXX, которое нужно читать как из Teradata (используя BTEQ), так и из DB2. В настоящее время я могу заставить его читать либо из 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. Когда это было изменено на чтение из Teradata, прежде чем вообще иметь какое-либо отношение к DB2, это работало.

1 Ответ

2 голосов
/ 02 декабря 2009

Не думаю, что это имеет какое-либо отношение к 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 - 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,,,,,

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

...