희한한 SQL입니다... 0 6 1,330

by 한현희 [2015.08.11 13:47:34]


안녕하세요. 
오라클 사용하다가 참 희한한 광경을 많이보네요.
아래 SQL 돌아가는 환경은 
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production 이고,
서버 이관하기전에는 작동했던 SQL 인데요.
실제로 TT라는 테이블에 바인드 변수 넣은데로
SITE_CD, IN_DATE, STORE_CD, ACO_CD, SHOP_ID 조건으로 SELECT 를 하면 데이터가 조회됩니다.
그러나 UPDATE 문이 돌지 않습니다.
혹시나 WHERE 절에   ( AND B.RTN_APPLY_YN = 'Y'   AND B.FEE_APPLY_YN = 'Y') 이 조건이 아닌가 하여도 실제 데이터에서 이 데이터가 맞습니다.
UPDATE 문에서  ( AND B.RTN_APPLY_YN = 'Y'   AND B.FEE_APPLY_YN = 'Y') 아래조건을 빼도 돕니다.
그러나 아래의 조건에 또다른 조건을 넣어도 돕니다.
오라클 집합문제...(?) 오라클 버전문제...(?) 도대체 무슨 문제때문에 이럴까요 ?
도움좀 주세요 ㅜ_ㅜ 참고로 10.2.0.1환경에서는 돕니다.


<strong>
[오류 SQL]</strong>
UPDATE TT T
   SET T.FEE_APPLY_YN = 'N'
 WHERE (T.SITE_CD, T.IN_DATE, T.STORE_CD, T.ACO_CD, T.SHOP_ID) IN
       (
        SELECT 
               A.SITE_CD ,
               B.DAYS IN_DATE ,
               A.STORE_CD,
               C.CARD_CD ACO_CD,
               D.SHOP_ID SHOP_ID
          FROM (
                 SELECT :SITE_CD SITE_CD,
                        SITE_CD  STORE_CD
                   FROM AA A
                  START WITH SITE_CD = :STORE_CD
                 CONNECT BY PRIOR SITE_CD = P_CD
               ) A,
               BB B,
               CC C,
               DD D
         WHERE B.DAYS >= :FROMDATE
           AND B.DAYS <= :TODATE
           AND C.SITE_CD = A.SITE_CD
           AND (:ACO_CD = '*' OR :ACO_CD = C.CARD_CD )
           AND D.SITE_CD  = A.SITE_CD
           AND D.STORE_CD = A.STORE_CD
           AND D.ACO_CD   = C.CARD_CD
           AND (:SHOP_ID = '*' OR :SHOP_ID = D.SHOP_ID )
       )
   AND B.RTN_APPLY_YN = 'Y'
   AND B.FEE_APPLY_YN = 'Y'


[실행되는 SQL]
UPDATE TT T
   SET T.FEE_APPLY_YN = 'N'
 WHERE (T.SITE_CD, T.IN_DATE, T.STORE_CD, T.ACO_CD, T.SHOP_ID) IN
       (
        SELECT 
               A.SITE_CD ,
               B.DAYS IN_DATE ,
               A.STORE_CD,
               C.CARD_CD ACO_CD,
               D.SHOP_ID SHOP_ID
          FROM (
                 SELECT :SITE_CD SITE_CD,
                        SITE_CD  STORE_CD
                   FROM AA A
                  START WITH SITE_CD = :STORE_CD
                 CONNECT BY PRIOR SITE_CD = P_CD
               ) A,
               BB B,
               CC C,
               DD D
         WHERE B.DAYS >= :FROMDATE
           AND B.DAYS <= :TODATE
           AND C.SITE_CD = A.SITE_CD
           AND (:ACO_CD = '*' OR :ACO_CD = C.CARD_CD )
           AND D.SITE_CD  = A.SITE_CD
           AND D.STORE_CD = A.STORE_CD
           AND D.ACO_CD   = C.CARD_CD
           AND (:SHOP_ID = '*' OR :SHOP_ID = D.SHOP_ID )
       )
  AND B.SITE_CD = :SITE_CD
   AND B.RTN_APPLY_YN = 'Y'
   AND B.FEE_APPLY_YN = 'Y'

 

 

 

 

by 겸댕2후니 [2015.08.11 14:41:54]

결과가 오류가 발생하는건가요, 아니면 0row가 업데이트되는건가요?


by 한현희 [2015.08.11 15:01:36]

0 ROW가 UPDATE 가 되요 .


by jkson [2015.08.11 17:53:05]

update하는 테이블은 T인데 

AND B.RTN_APPLY_YN = 'Y'
AND B.FEE_APPLY_YN = 'Y'
 
이 조건은 뭐죠??
 
옮기다가 잘못적으신 건지..
결국은 추가된 조건은
AND B.SITE_CD = :SITE_CD
 
밖에 없는데 잘 작동한단 말씀이신거죠?

by 한현희 [2015.08.11 18:36:05]

아 사실 T테이블이 B테이블이었는데 ....WHERE 절에

  AND T.SITE_CD = :SITE_CD
   AND T.RTN_APPLY_YN = 'Y'
   AND T.FEE_APPLY_YN = 'Y'
 
입니다.
위조건처럼 수정하면 잘도는데 ... AND T.SITE_CD = :SITE_CD 조건을 빼면은 안돌아요 UPDATE 문이 ㅜ ..O건이 UPDATE 된다고 뜹니다

by jkson [2015.08.12 08:06:35]

(T.SITE_CD, T.IN_DATE, T.STORE_CD, T.ACO_CD, T.SHOP_ID) IN .. 이 부분에 컬럼 형식이 안 맞는 데이터가 있어서 오류 나는 것 아닐까요? t테이블의 IN_DATE 컬럼은 date 형인데 b 테이블의 DAYS IN_DATE 컬럼에는 20150132 와 같이 varchar2형의 잘못된 데이터가 있다든지.. 혹은 char형 컬럼이 있다든지 해서 :site_cd 조건이 들어가서 해당 데이터가 포함 되어있지 않으면 update되고 잘못된 데이터가 들어있으면 update 안 되고.. 뭐 그런 상황 같은데요.. 그런데 오류가 아니라 update 결과가 0건이라시니.. 프로그램단에서 말고 쿼리 직접 날려도 오류가 안 난다는 말씀이시죠?


by 한현희 [2015.08.12 10:01:46]

네 실행했던건 모두 db툴사용해서 직접쿼리를 날린것입니다 .

그리고 실제로 where절에 들어가야할값을 안부분에서 select 되어나온값으로 t테이블을 바로 셀렉트는됩니다.....

데이터형문제는 아닌것갘습니다 

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입