2023년 4월 9일 일요일

JDBC Receiver 어댑터 바인딩모드 사용 시 에러정리(오라클)

SAP PO에서 타겟쪽 JDBC어댑터에서 기본설정으로 사용 시 리터널 쿼리로 실행이 되며 가끔 DBA한테 해당 쿼리에 대해 바인딩 처리해달라는 요청이 오는경우가 있습니다. 

이런경우 오라클인경우 'alter session set cursor_sharing' 처리를 하거나 채널의 옵션을 사용해 바인딩처리를 하는데 리터널 쿼리의 기본적인 사용법보다 제약사항도 있고 컬럼 타입별로 사용방법도 번거로운부분이 존재하 기도 하지만 처리속도는 향상되는것 같습니다.

해당 내용은 바인딩 사용 시 발생되는 에러와 원인 등에 대해 정리한 글입니다.

기본 바인딩 구성

  • 타겟 DB 컬럼타입에 NUMBER, DATE 타입존재
  • 타겟 Insert DataType의 어커런스는 Statement는 0..1, access는 0..n
  • Receiver Adapter > Advanced 설정
  • Batch Mode는 체크
  • sqlBindMode는 true
  • dataWithBindMode는 true

바인딩 사용 시 에러 정리

에러내용은 
java.sql.SQLException: FATAL ERROR in structure 'Statement': SQL queries are not supported in SQL Bind mode
생성된 구조에 오류가 있고 SQL 바인드 모드에서는 SQL쿼리가 지원되지 않습니다.

에러 발생 시 데이터구조는
<Statement>
 <dbTable action="SQL_DML">
  <access>DELETE FROM AAA</access>
 </dbTable>
</Statement>

정상구조는
<Statement>
 <dbTable action="DELETE">
  <table>AAA</table>
  <key>
   <BBB compareOperation="GT">
   </BBB>
  </key>
 </dbTable>
</Statement>

ORA-01830: date format picture ends before converting entire input string
ORA-01830: 날짜 형식의 지정에 불필요한 데이터가 포함되어 있습니다.

원인은
타겟 컬럼타입이 DATE인데 STRING으로 '2023-02-23 00:00:00.000'로 넣을려고 했을때고 에러났을때 구조는 아래와 같습니다.
<AAA_TM metadata="TO_TIMESTAMP~~CHAR~~CHAR" hasQuot="NO"><TO_TIMESTAMP('2023-02-23 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS')</AAA_TM>

ORA-01722: Invalid number
ORA-01722: 수치가 부적합합니다.
처음에 원인이 DATE컬럼 타입에 대한 바인딩구조를 잘못사용한거라고 생각했찌만 NUMBER타입에 바인딩 구조를 사용안해 발생되었던 에러였던것 같습니다.
에러구조는
<AAA_TM metadata="TO_TIMESTAMP~~CHAR~~CHAR" hasQuot="NO"><TO_TIMESTAMP('2023-02-23', 'YYYY-MM-DD HH24:MI:SS')</AAA_TM>
<AAA_TM metadata="TO_DATE~~CHAR~~CHAR" hasQuot="NO"><TO_DATE('2023-02-23', 'YYYY-MM-DD')</AAA_TM>

2189984 - SQLBindMode:A non-numeric character was forund, while a numeric character was epected 참고

아래 구조로 2건이상 테스트 시 성공
<AAA_TM metadata="TO_DATE~~CHAR~~CHAR" hasQuot="NO"><TO_DATE('2023-02-23', 'YYYY-MM-DD HH24:MI:SS')</AAA_TM>

Batch,dateWithBindMode,sqlBindMode 설정 제거 후 성공

sqlBindMode만 제거 후 성공

왜 sqlBindMode를 추가하면 ORA-01722: invalid number 에러가 발생될까?

타겟 NUMBER 타입인 컬럼들 모두 1로 고정값으로 넣을때(실제 데이터는 0.115,1,2 존재) 와 해당 필드를 제거하는 경우 성공되었습니다.


위 노츠 내용처럼 데이터베이스의 스탠다드 펑션(TO_NUMBER) 등을 사용하여 바인드모드일때도 타겟컬럼 타입이 NUMBER일때 정상처리가 가능(해보진 않았음)할것 같은데 나중에 바인딩 처리가 필요한 인터페이스 요청이 오는 경우 송,수신 컬럼타입을 VARCHAR로 변경이 필요하다는 전제조건을 제시를 해봐야될것 같습니다. 

이전에 작성한 글들

댓글 없음:

댓글 쓰기

최근글

9월 태안~천안 아이와 3박4일 가족 여행지