타입은 varchar2(4000) 이고 데이터 값은 무조건 문자형입니다.
JOIN 전 한 테이블 쿼리시 아무 문제가 없습니다.
EX)
select col1 from table1 where col1='abc'
조인 후에 하면 01722 뜹니다. 그리고 더 이상한건 조인해도 어떤 문자는 되고 어떤 문자는 01722떨어집니다.
ex1) 조건 값이 똑같은 문자이나 대문자일땐 에러 소문자일땐 문제없이 돌아갑니다.
ex2) G-xxx는 문제없이 되나 R-xxx는 01722 떨어집니다. r-xxx는 또 됩니다.
to_char 형변환해도 똑같이 에러떨어지고
아무리 생각해도 이해가 되지 않네요..
현재 테스트중인데 참 이건 뭔 상황인지.
현재 select col1, col2,col3,col4 from (
select a.col1,b.col2,a.col3.b.col4 from tableA a inner join tableB on a.col1=b.col1
where col4='문자'); 인데 컬럼이 수십개라 하나하나씩 하다가
select * from (
select a.col1,b.col2,a.col3.b.col4 from tableA a inner join tableB on a.col1=b.col1
where col4='문자')
이런 식으로 변경 후에는 아무 문제 없이 되네요.
a테이블 b테이블 값은 다르지만 컬럼명은 똑같은거 있습니다. 그래서 인라인뷰에 명시도 해놨고
조건절에도 명시 한 상태인데.. 아무리 생각해도 이유를 모르겠네요
쿼리가 달라지면서 실행계획이 달라질 수 있습니다.
실행계획이 달라지면서 해당 오류가 발생되는 부분이 제거될 수도 있습니다.
예를 들면.
A 에 10건(1~10)과 B 의 5건(1~5)과 조인하여 5건을 반환할때
A 의 9번 자료가 오류자료라고 가정히면.
A -> B 방향으로 조인되는 경우 9번째 조인 하다가 에러 발생 될 수 있고
B- > A 방향으로 조인되는 경우 오류가 안날 수 있습니다.
오류는 명확합니다. 쿼리에서 묵시적 형변환이 발생될만한 부분을 찾아야 합니다.
조건절이든 함수 사용 부분이든
그 다음 여기서 사용된 컬럼의 값을 확인해야죠.
전체 쿼리를 잠깐이라도 올려주시는 게 정확할 거 같네요. 각 컬럼 데이터형이랑..
컬럼이 date형이 맞다면 to_char(컬럼,'yyyy-mm-dd')는 문제 없었을 거고요.
다른쪽 문제일듯해요.
0999-06-26을 1999-06-26으로 바꾸어서 잘 되었던 것은 단순히 상위 몇 건만 조회되어서 보여줬기 때문일 것 같은데요. select 절이 단순 컬럼 나열이라면 select절을 count(1)로 바꾸어보면
전체 데이터 조회하면서 오류 났을 것 같습니다.
컬럼나열한 부분을 *로 바꾼 것 역시 전체 order by나 다른 조건에 의해 실행계획이 바뀌면서 먼저 조회되는 row에 데이터 convert 실패할만한 건이 없었기 때문이 아닐까 생각되고요.
마농님 말씀대로 묵시적 형변환 부분이 없나 체크해보세요.
문자형컬럼 = 1
이런식으로 조건절이 있으면
내부적으로는 to_number(문자형컬럼) = 1로 쿼리가 바뀝니다.