문제

최적화하려는 Pro*C 쿼리에 문제가 있습니다.

설명하기 위해, 우리의 응용 프로그램은 거대한 데이터베이스에서 행을 검색합니다. 이 행은 여러 언어로 존재하며 이전 코드는 배열에서 각 언어에 대해 행을 선택했습니다. 이제 이러한 쿼리가 앱에서 가장 시간이 많이 걸리는 부분이므로 배열에 직접 쓰는 쿼리 만 만들고 싶었습니다.

언어 코드는 2 글자 ISO-639 코드입니다 (영어의 경우, 프랑스어의 경우 FR).

구식 (이것은 의도를 보여주는 단순화 된 코드 일뿐입니다)

struct ROW arr[MAX_LAN];
struct ROW_IND arr_ind[MAX_LAN];
uint_t LanIdx;
for(LanIdx=0; LanIdx<MAX_LAN; LanIdx++) {
  EXEC SQL SELECT *  /* Don't look at the *, it's for obfuscation only */
      INTO :arr[LanIdx]:arr_ind[LanIdx]
      FROM table WHERE id=:uniqid AND language=:LanCode[LanIdx];
}

나는 다음과 같은 일을하고 싶습니다 :

EXEC SQL SELECT *  /* Don't look at the *, it's for obfuscation only */
    INTO :arr:arr_ind
    FROM table WHERE id=:uniqid AND language IN (:LanCodes);

그러나 내가 어떻게 lancodes를 정의 해야하는지 모릅니다.

이와 같은 상수 (컴파일 타임) 목록과 함께 작동합니다.

EXEC SQL SELECT *  /* Don't look at the *, it's for obfuscation only */
    INTO :arr:arr_ind
    FROM table WHERE id=:uniqid AND language IN ('en','fr','de');

그러나 언어는 사례마다 다를 수 있으므로 이것은 유용하지 않습니다.

내가 같은 것을 쓰면

char LanCodes[MAX_LANS*5];
sprintf(LanCodes, "%s", LanCode[LanIdx]);

EXEC SQL SELECT *  /* Don't look at the *, it's for obfuscation only */
    INTO :arr:arr_ind
    FROM table WHERE id=:uniqid AND language IN (:LanCodes);

문자열에 1 개의 언어 코드가있는 경우에만 작동합니다.

그래서 내 질문은, 아무도이 일을하는 방법을 아는 사람이 있습니까? 오라클 문서가 너무 커서 어디를 볼지 모르겠습니다. 나는 다른 방식으로 시도했지만 아무도 효과가 없었습니다.

편집하다좋아, 나는 작동하는 솔루션을 찾았다. 우아하지 않고 발전되지는 않지만 잘 작동합니다. 쿼리에 목록이나 조항을 넣고 필요한 형태로 필요한 것을 반환합니다.

EXEC SQL SELECT *  /* Don't look at the *, it's for obfuscation only */
    INTO :arr:arr_ind
    FROM table WHERE id=:uniqid AND (
                language=:v1[ 0] OR
                language=:v1[ 1] OR
                language=:v1[ 2] OR
                language=:v1[ 3] OR
                language=:v1[ 4] OR
                language=:v1[ 5] OR
                language=:v1[ 6] OR
                language=:v1[ 7] OR
                language=:v1[ 8] OR
                language=:v1[ 9] OR
                language=:v1[10] OR
                language=:v1[11] OR
                language=:v1[12] OR
                language=:v1[13] OR
                language=:v1[14] OR
                language=:v1[15] OR
                language=:v1[16] OR
                language=:v1[17] OR
                language=:v1[18] OR
                language=:v1[19] OR
                language=:v1[20] OR
                language=:v1[21] OR
                language=:v1[22] OR
                language=:v1[23] OR
                language=:v1[24] OR
                language=:v1[25] OR
                language=:v1[26] OR
                language=:v1[27] OR
                language=:v1[28] OR
                language=:v1[29] OR
                language=:v1[30]);

2 개 이상의 언어가있을 때 더 빠르기 때문에 가져올 언어 수에 따라이 변형 또는 기존 언어를 호출합니다.

도움이 되었습니까?

해결책

아마 이것 AskTom 기사 당신을 도울 수 있습니다.

다른 팁

당신은 없이는 이것을 할 수 없습니다 Oracle Dynamic SQL. 런타임에 in in clause를 구축하고 즉시 실행해야합니다. 최소한 쿼리를 기반으로 방법 1을 사용할 수 있습니다.

나는 신분증과 행이 "in"목록의 가능한 값의 순열 인 ID와 행을 구성하기 전에 테이블을 사용했습니다. 그런 다음 ID를 기반으로 테이블에 가입하고 필요한 결과를 제공합니다.

create table permute (
  id number,
  lang char(2)
);
create index permute_p1 on permute ( lang, id );
insert into permute ( id, lang ) values ( 1, 'en' );
insert into permute ( id, lang ) values ( 2, 'en' );
insert into permute ( id, lang ) values ( 2, 'fr' );
...

그런 다음해야 할 일은 올바른 "ID"값 2, 3, 4 ...을 선택하고이를 Join에 넣는 것입니다.

... 기본 문자열 : = '선택 *에서 id = : uniqid and language in'; - x_table에서 v_string으로 v_string으로 alang 루프 복사 및 concat v_string to lancode_string 및 '',; 엔드 루프; .. Lancode를 메인 스트링에 연결합니다. .. 기본 문자열을 준비하고 실행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top