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.