Teradata 출력 및 DB2 출력 모두에 액세스하기 위해 Rexx를 사용하는 문제

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

  •  05-07-2019
  •  | 
  •  

문제

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 ,,,,

예를 들어, 둘 다 함께 사용될 때 메모리가 충분하지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top