Teradata 출력 및 DB2 출력 모두에 액세스하기 위해 Rexx를 사용하는 문제
문제
Teradata (BTEQ 사용)와 DB2를 모두 읽어야하는 Rexx 작업이 있습니다. 현재 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에서 읽습니다. 이것이 DB2와 전혀 관련이 있기 전에 이것이 Teradata에서 먼저 읽는 것으로 변경되었을 때, 그것은 효과가있었습니다.
해결책
나는 이것이 Sysprint 또는 Sysin과 관련이 있다고 생각하지 않습니다.
sqlcode = 1이 아닌 tso rc = 1을 받고 있다고 생각합니다 (1의 sqlcode가 없기 때문입니다.
1은 경고이고 -1은 오류입니다. DB2 응용 프로그램 프로그래밍 및 SQL 가이드에서 이것을 찾을 수 있습니다.
추적 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, n ,,, 2 ,,,,
예를 들어, 둘 다 함께 사용될 때 메모리가 충분하지 않을 수 있습니다.