동적쿼리 안쓰고 프로시져 파라미터에 in 값 넣는건..불가능..? 0 6 3,486

by 조조맹덕 [2009.10.08 11:22:14]


버전은 10g이구요.


오라클에서... 안되는건 아는데요 ㅠㅠ

오래전에... 포기했던 부분이지만.. 지금 프로젝트에서도 참.. 요원한 일이라서요.

요거 하나를 위해서 동적쿼리 써야하나... 싶어서요 

자주 있는 이슈인.. 프로시져 파라미터로...

쿼리에 where 조건에 in 으로 들어갈 값을.. 처리가 가능한.. 방법이 없을까 입니다.

물론 동적쿼리를 쓰지 않고...

동적쿼리 외엔.. 방법이 없을까요?

in 에 들어갈 부분이 서브쿼리가 아니라 복수의 value인데.. 파라미터로 못받는건 좀.. 안타깝군요.


쿼리는 다음과 같습니다.

select * from 디테일테이블
where 마스터키 in ( 마스터키들..)

 

by 마농 [2009.10.08 13:14:38]
WITH t AS
(
SELECT 'A' cd FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'AB' FROM dual
UNION ALL SELECT 'AC' FROM dual
UNION ALL SELECT 'CD' FROM dual
UNION ALL SELECT 'D' FROM dual
UNION ALL SELECT 'DD' FROM dual
)
, v AS
(
SELECT 'A,AB,CD,D' v FROM dual
)
SELECT t.*
FROM t, v
WHERE ','||v.v||',' LIKE '%,'||t.cd||',%'
;
테이블 데이터량이 적을때는 간단하게 이와 같이 하시면 됩니다.

by 마농 [2009.10.08 13:15:28]
WITH t AS
(
SELECT 'A' cd FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'AB' FROM dual
UNION ALL SELECT 'AC' FROM dual
UNION ALL SELECT 'CD' FROM dual
UNION ALL SELECT 'D' FROM dual
UNION ALL SELECT 'DD' FROM dual
)
, v AS
(
SELECT 'A,AB,CD,D' v FROM dual
)
SELECT *
FROM t
WHERE t.cd IN
(
SELECT SUBSTR(v,INSTR(','||v,',',1,lv),INSTR(v||',',',',1,lv)-INSTR(','||v,',',1,lv)) v
FROM v
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL < 9)
WHERE lv <= LENGTH(TRANSLATE(','||v,','||v,','))
)
;
테이블 데이터량이 많아 느리다면 이처럼 하셔서 인덱스를 태우도록 하세요.

by 조조맹덕 [2009.10.08 14:32:14]
아... 저렇게 가능하군요.. 좀 분석을 해야겠지만.. (어려워 보이긴 한데..)
파라미터가 즉 '||v.v||' '||t.cd||' 란 말씀....이신가요?

일단 커서로 from 하는 방안도 검토중이긴 한데.. ^^
요것도 좋겠네요. 검토해보겠습니다.
답변 감사드립니다 ^^

by 마농 [2009.10.08 14:37:11]
아닌데요 ㅡ.ㅡ;
파라미터는 'A,AB,CD,D' 입니다.
제가 테스트를 위해 별도로 v 로 표현했구요.

by 조조맹덕 [2009.10.08 14:52:02]
아.... 덤프 데이터를 위해서 하신거였구나..;;
ㅎㅎㅎㅎ 그렇게 보니 심플한걸요? 오우..굿입니다.

by 조조맹덕 [2009.10.08 16:27:33]
음.. 근데 신기한게..

토드에선 sys_refcursor 커서로 리턴할려고 하니...에러가 나는군요;;
OPEN out_List FOR

WITH t AS ... 해서 하니;;
문법 오류라고 뜨는데 전혀 엉뚱한 오류가;;
암만 봐도 이상해서 PL/SQL에서 컴파일 하니 잘됨 -_-;
이건 뭥미;;

WITH 문을 잘 안쓰나 봐요..(실은 오라클에서 첨봄 ) ㅎㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입