Jak określić zmienną listę wyrażeń w zapytaniu Pro * C?

Mam problem z zapytaniem Pro * C, które próbuję zoptymalizować.

Aby to wyjaśnić, nasza aplikacja wyszukuje wiersze w ogromnej bazie danych. Wiersze te istnieją w kilku językach, a stary kod wybrał wiersz dla każdego języka w tablicy. Ponieważ te zapytania są najbardziej czasochłonną częścią naszej aplikacji, chciałem wykonać tylko jedno zapytanie, które zapisuje bezpośrednio w tablicy.

Kody językowe to 2-literowe kody ISO-639 (en dla angielskiego, fr dla francuskiego).

Stary sposób (jest to tylko uproszczony kod, aby pokazać zamiar)

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];
}

Chciałbym zrobić coś takiego:

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);

ale nie wiem, jak powinienem definiować LanCodes.

Działa z taką stałą listą (czas kompilacji)

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');

ale nie jest to przydatne, ponieważ języki mogą się różnić w zależności od przypadku.

Jeśli napiszę coś takiego

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);

działa tylko wtedy, gdy w ciągu występuje 1 kod języka.

Moje pytanie brzmi: czy ktoś wie, jak to zrobić? Dokumentacja Oracle jest tak duża, że ​​nie wiem, na co patrzeć. Próbowałem różnych sposobów, ale żaden nie działał.

EDYTOWAĆ Ok, znalazłem rozwiązanie, które działa. Nie jest elegancki, nie jest zaawansowany, ale działa dobrze. W zapytaniu umieściłem listę klauzul OR i zwraca to, czego potrzebuję w postaci, której potrzebuję.

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]);

Jest szybszy, gdy jest więcej niż 2 języki, więc nazywam ten wariant lub stary w zależności od liczby języków do pobrania.

questionAnswers(4)

yourAnswerToTheQuestion