سؤال

لدي مشكلة مع برو*ج الاستعلام أحاول تحسين.

شرح, التطبيق لدينا يبحث عن الصفوف في قاعدة بيانات ضخمة.هذه الصفوف موجودة في عدة لغات القانون القديم مختارة صف واحد لكل لغة في صفيف.الآن مثل هذه الاستعلامات هي الجزء الأكثر استهلاكا للوقت من التطبيق لدينا ، أردت أن تجعل واحدة فقط الاستعلام الذي يكتب مباشرة في صفيف.

لغة الرموز 2 رسالة ISO-639 رموز (ar الإنجليزية, 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 SQL ديناميكية.سيكون لديك لبناء الخاصة بك في البند في وقت التشغيل وتنفيذ فوري.على الأقل يمكنك استخدام الأسلوب 1 ، بناء على الاستفسارات الخاصة بك.

لقد استخدمت الجدول قبل تتألف من معرف مجموعة من الصفوف حيث الصفوف التقليب من الممكن القيم في "في" قائمة.ثم أنضم إلى طاولة المفاوضات على أساس معرف لي ويعطيني ما أريد

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 ...ووضع ذلك في الانضمام.

...الرئيسية سلسلة:= 'Select * FROM table WHERE id=:uniqid واللغة في';- يمكن أن تنقسم إلى اثنين إلى accomadate :uniqd ...حدد Language_code في v_string من x_table;حلقة نسخ و Concat v_string إلى LanCode_String مع ' ', ;نهاية الحلقة ؛ ..Concat Lancode الرئيسية في السلسلة...إعداد وتنفيذ الرئيسي في السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top