Проблемы с использованием 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, это сработало.


person lins314159    schedule 10.09.2009    source источник


Ответы (1)


Я не думаю, что это имеет какое-либо отношение к SYSPRINT или SYSIN.

Я думаю, что вы получаете TSO RC = 1, а не SQLCODE = 1 (потому что нет SQLCODE, равного 1.

1 — предупреждение, -1 — ошибка. Вы можете найти это в Руководстве по прикладному программированию и SQL DB2.

Включите 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, , , , ,

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

person Bob Stark    schedule 02.12.2009
comment
Спасибо за Ваш ответ. На самом деле у меня было исправление для этого (см. редактирование для объяснения) некоторое время назад, но я забыл опубликовать его. Однако я до сих пор почти не понимаю, почему старая реализация не работала. Я отмечу это как правильный ответ, если вы поможете уточнить. - person lins314159; 03.12.2009
comment
Я думаю, что вы должны сбросить эти поля SQLWARN.1, SQLWARN.2 и т. д., если вы получите предупреждение, выяснить, какое из них заполнено, и исправить эту ошибку, копаясь в руководстве. Вероятно, это как-то связано с конкретным запросом, и когда вы переделывали программу, запрос был немного другим, вы использовали другой курсор или что-то в этом роде. - person Bob Stark; 04.12.2009