동적쿼리문에서 IN문장에 변수 받는 방법?? 1 3 6,927

by 나그네 [Oracle 기초] [2014.08.20 08:22:44]


 동적 쿼리에서
 SELECT *
 FROM  aaa
 WHERE aaa.bbb IN (:p_type)
 ;
 
 파라미터에 다중의 값을 ... 즉 p_type변수에 넣고 싶은데요..... A,B,C...
 p_type:= 'A,B,C,..';

즉 쿼리가
  SELECT *
 FROM  aaa
 WHERE aaa.bbb IN ('A','B','C'...)
 ;
형태의 데이타를 불러와야 되는것이죠..
 위 쿼리문에서 IN 절에 다중의 값이 들어가게 받고 싶은데
 package구성이 어렵네요..변수값이 문자라서 더 골치가 아프네요
  -->
 DBMS_SQL.BIND_VARIABLE(cursor_id, param_name, p_type);
 많은 조언 바랍니다.

by 손님 [2014.08.20 09:40:51]
in 절로 들어가는 값이 정해져잇는거라몀
바인드변수를 그만큼 선언해서 하는방법이잇겟내요
아니면 동적쿼리에 대해서 찾아서 보세욧

by 우리집아찌 [2014.08.20 09:45:18]

by 마농 [2014.08.20 10:10:00]

바인드 변수값은 하나의 문자열로 인식될 뿐입니다.
여러개의 값으로 인지되지 읺습니다.
따라서 IN 조건으로는 비교 안되며


1. 문자열 비교 방식으로 해야 합니다.
 WHERE INSTR(','||:p_type||',', ','||aaa.bbb||',')
 WHERE ','||:p_type||',' LIKE '%,'||aaa.bbb||',%'
코드값의 길이가 고정인 경우라면 앞뒤로 컴마를 붙이지 않아도 됩니다.
이렇게 문자열 비교를 하게 되면 인덱스를 사용하지 못하게 됩니다.


2. 인덱스를 사용하도록 하려면 하나의 문자열을 분리해서 여러행으로 만들어야 합니다.
 WHERE aaa.bbb IN (SELECT REGEXP_SUBSTR(p, '[^,]+', 1, LEVEL)
                     FROM (SELECT :p_type p FROM dual)
                    CONNECT BY LEVEL <= REGEXP_COUNT(p, ',') + 1 -- 11g
                  --CONNECT BY LEVEL <= LENGTH(p) - LENGTH(REPLACE(p, ',')) + 1 -- 10g
                   )


3. 동적 쿼리를 사용
 DBMS_SQL 이 나오는걸로 보아 이미 동적 쿼리를 사용하시고 계시네요.
 바인드 변수로 하지 마시고 SQL 에 문자열로 연결하세요.
 p_type := '''A'',''B'',''C''';
 v_sql := v_sql || ' WHERE aaa.bbb IN (' || p_type || ')';

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