오라클 프로시져 쿼리 질문 입니다~고수님들 도와주십시오. 0 4 677

by 에즈레인보우 [SQL Query] [2018.12.12 15:30:42]


PROCEDURE SP_TEST (   P_AAAAA    IN  VARCHAR2 )

프로시져에서 P_AAAAA라는 파라메터 값을 받아서 

SELECT * FROM TEST A

WHERE A.EMP_NO IN (P_AAAAA) 로 실행을 시키는 데이터가 조회되지 않습니다.

P_AAAAA값은 문자열로 아래 포맷으로 한개 또는 여러개 값을 통으로 가지고 옵니다.

ex) 'BAB','TOM','YES'

'(작은따옴표) 또는 ,(콤마) 쪽이 문제가 되는거 같은데 해결 방법 좀 알수 있을까요? 

시간내셔서 답변주시는 분 미리 너무 감사드립니다.

by 우리집아찌 [2018.12.12 15:48:05]

DB 가 어떤것 이신가요?

MS-SQL은 바로 리턴되지만

ORACLE를 그렇지 못합니다. REF CURSOR 이용하셔야합니다.

SQL 로 바꿀수 있는지 한번 체크해보세요


by 에즈레인보우 [2018.12.12 16:07:27]

DB는 오라클입니다. 

찾아보다가 아찌님 작성하신 글중에 아래처럼 하라는 내용이 있는데

select regexp_substr('a,b,c','[^,]+' , 1 , level ) cd

from dual connect by level <= regexp_count('a,b,c',',')  + 1

-------------------------------------------------------------------

SELECT * FROM TEST A

WHERE A.EMP_NO IN ( select regexp_substr(P_AAAAA,'[^,]+' , 1 , level ) cd

                               from dual connect by level <= regexp_count(P_AAAAA,',')  + 1 ) 

이 문법을 사용하면 데이터는 정상적으로 나옵니다.

인덱스일때만 사용하라는 이야기가 있던데 혹시 해당 함수가 시간을 많이 잡아먹나요?

감사합니다!!


by 우리집아찌 [2018.12.12 16:39:40]

조건절에 인덱스는 필수적이지요.

그렇지 않으면 FULL SCAN 타니까요.

즉 EMP_NO에는 인덱스가 있어야합니다.

정규식 함수 써도 한번만 호출하는것들이라 괜찮습니다.

 


by 마농 [2018.12.13 09:03:44]

컴머로 구분한 하나의 긴 문자열입니다.
여러개의 값으로 인식하는게 아니라 하나의 값으로 인식합니다.
다음 3가지 정도의 대안이 있겠네요.
1. 쪼개어 조건을 주는 방법 : http://gurubee.net/article/55635
2. 문자 비교로 풀이하는 방법 : INSTR(p_aaaaa, ''''||a.emp_no||'''') > 0
3. 동적 쿼리를 이용하는 방법 : http://gurubee.net/article/19612

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