뭐.... 그냥 개발하면 이런 Case가 없겠지만...
Package 제품이다 보니 사용자쪽에서 Varchar2로 선언된 Field에 Numeric Data를 집어 넣은 Case가 발생하였다.
Mysql에서는 조건절에 일반 numeric data처럼 ''를 사용하지 않으면 잘 실행되었는데..
( 즉.. SELECT ... FROM Campaign WHERE insertionOrder > 6 )
Oracle에서는 위와 같이 하면... "ORA-01722: invalid number" 오류가 발생한다.
예전에는 됐던것 같은데.... 하고 생각해보니 내가 이렇게 썼던 기억은 없는것 같다.^^
물론 ''를 줄 경우에는 character 비교가 되니 10 같은 값은 numeric으로 비교하면 6보다 커도 character로 비교되면 6보다 작아 나오지 않는 다는...-.-
염대리님하고 상의를 해본 결과 아래와 같은 Query가 나왔다.
select insertionOrder from Campaign where decode(length(translate(insertionOrder, 'A1234567890','A')),null, to_number(insertionOrder), 0) > 6
위에 파란색으로 표시된 부분은 Numeric value일 경우 null을 Return해 주는 Query이다.
( translate function(A,B,C) 는 A 문자열내에 있는 B character들을 C character들로 치환 해 주는 function이다. 즉 위의 경우는 A->A , 1 ~ 9 , 0-> 치환 없음 이 되므로 translate 실행 결과 숫자 데이터들은 null(확실하지는 않지만 length 결과가 null이 되는 걸로 봐서는 null이 맞을 듯 싶다.)이 되면서 이를 통해 numeric data 여부를 판단할 수 있는 것이다.
염대리님이 찾아 낸 또다른 Tip은
select * from ( select * from Campaign where LOWER(insertionOrder) = UPPER(insertionOrder)) where insertionOrder > 6
인데 애석하게도 우리 System은 Character insensitive 환경을 구성하여
일단 Character 값을 LOWER(insertionOrder) = UPPER(insertionOrder) 로는 제거할 수 없다는...-.-
( 그나저나 어떤 설정으로 Character insensitive하게 구성했는지..
아직 까진 그 option을 본적이 없는데...
그러고 보니 "_" 두개 이상일경우에 like 검색 잘 되지 않던 Issue도 option으로 해결 한것 같은데..
흠.. 언젠가 본사 쪽 사람이랑 얘기할 기회가 생기면 이 부분에 대해 한번 물어 봐야 겠다.^^ )
'개발자세상 > Database관련' 카테고리의 다른 글
MYSQL에서 copy_t , copy_ymd 테이블 만들기 (0) | 2009.03.13 |
---|---|
MYSQL에서 Rownum 사용하기 (0) | 2009.03.13 |
Oracle에서 datafile size 크기 제한을 없애는 query (0) | 2009.03.04 |
Oracle에서 Datafile 사용량 체크 (0) | 2009.03.04 |
MYSQL 5.X 사용시 이전 Client 모듈로 접속할 경우 (0) | 2009.03.02 |