동적 쿼리에서
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);
많은 조언 바랍니다.
바인드 변수값은 하나의 문자열로 인식될 뿐입니다.
여러개의 값으로 인지되지 읺습니다.
따라서 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 || ')';