2013-03-14 4 views
1

오라클에서 DB2로 스토어드 프로 시저 코드를 마이그레이션 중이므로 어레이 멤버십을 테스트하는 방법을 찾아야합니다 (Oracle에는 MEMBER OF 연산자가 있음).DB2 SQL PL의 어레이 멤버쉽 테스트하기

저장 프로시 저는 JDBC 코드를 통해 Java 코드의 매개 변수로받은 사용자 배열을 사용합니다. 해당 배열에서 구성원 테스트를 수행하는 가장 효율적인 방법을 찾고 싶습니다. 오라클 사용하여, 나는 할 것이다 : 나는 DB2에 MEMBER OF의 동등한을 찾을 수없는 그러나

FOR r IN (SELECT * FROM acls WHERE acls.id = curid) LOOP 
    IF r.user MEMBER OF users THEN 
    RETURN 1; 
    END IF; 
END LOOP; 

이 : 또 다른 내부 루프을

  1. :

    FOR r AS SELECT * FROM acls WHERE acls.id = curid DO 
        IF r.user ????? users THEN 
        RETURN 1; 
        END IF; 
    END FOR; 
    

    내가 두 가지 대안을 참조 모든 배열 요소는 "손으로"테스트를 수행합니다.

  2. 배열을 사용하지 않고 단일 문자열을 사용하고 LIKE 기반 패턴 일치를 사용하십시오.

더 좋은 방법이 있습니까? 이 배열은 외부 코드에서 가져온 것이므로 JOIN 또는 관련있는 테이블로 전달할 수 없습니다.

답변

0

associative array (DB2 9.7 이상에서 사용 가능) 및 array_exists predicate으로이 작업을 수행 할 수 있습니다. 나는 그것이 그 절차로 전달되는 것과 함께 실행할 수 있을지 확실하지 않습니다.

그러나 나는 매우 느린 array_exists을 발견했습니다. 커서를 사용하여 루핑하는 일반적인 디자인 또한 매우 느립니다.

  • 는 그에게 정상 join를 수행 프로 시저 내에서 임시 테이블에 사용자의 배열을 던져 : 성능이 필요한 경우

    대신 이러한 것들 중 하나를 수행 나을 것 같다 테이블을 사용하여 일치하는 레코드를 찾습니다.

  • 를 사용하여 이러한 in 절 내에서 같은 쿼리를 (구성 동적 SQL. 여기

는이 솔루션을 위해. 동적 SQL로 할 수있는 일의 예입니다 당신에게 하나의 문자열 분리를 보내 자바가 쉼표로 :..이 가정

declare v_sql varchar(1000); --Bigger than maximum possible result query... 
declare stmt varchar(1000); 
declare return_result integer; 
set v_sql = 'select case when count(*) > 0 then 1 else 0 end' & 
    ' from acls WHERE acls.id = curid and user in (' & users & ')' & 
    ' group by (1)'; 
prepare stmt from v_sql; 
open mycur; 
fetch mycur into return_result; 
close mycur; 
return return_result; 

사용자가 숫자 값은 그들이 문자열이있는 경우 각 사용자가 in 절에 인용하기 때문에, 그것이 작동하지 않을

+0

감사합니다, 나는 마법이 없다 생각 그 때 대답. –