Frage

Ich habe ein Problem mit einem Pro * C Abfrage Ich bin zu optimieren versucht.

Um unsere Anwendung sucht nach Zeilen in einer riesigen Datenbank zu erklären. Diese Reihen liegen in mehreren Sprachen und der alte Code eine Zeile für jede Sprache in einem Array ausgewählt. Nun, da diese Abfragen der zeitaufwendigste Teil unserer App sind, wollte ich nur eine Abfrage machen, die direkt in einem Array schreibt.

Die Sprachcodes sind zwei Buchstaben bestehenden ISO-639-Codes (en für Englisch, fr für Französisch).

Alte Art und Weise (dies ist nur eine vereinfachte Code, um die Absicht zu zeigen)

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

Ich möchte etwas tun:

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

, aber nicht wissen, wie ich soll LanCodes definieren.

Es arbeitet mit einer konstanten (Kompilierung) Liste wie diese

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

aber dies ist nicht sinnvoll, da die Sprachen von Fall zu Fall unterschiedlich sein können.

Wenn ich schreibe, so etwas wie

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

es funktioniert nur, wenn es 1 Sprachcode in der Zeichenkette.

Also meine Frage ist, hat jemand wissen, wie diese Arbeit zu machen? Die Oracle-Dokumentation ist so groß, ich weiß nicht, wo zu sehen. Ich habe versucht, verschiedene Möglichkeiten, aber keiner war.

Bearbeiten Ok, ich fand eine Lösung, die funktioniert. Es ist nicht elegant, es nicht so weit fortgeschritten ist, aber es funktioniert gut. Ich habe eine Liste von OR-Klauseln in meiner Anfrage und es gibt, was ich in der Form brauche, die ich brauche.

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

Es schneller ist, wenn es mehr als zwei Sprachen, so dass ich diese Variante nennen oder die alten auf der Anzahl der Sprachen in Abhängigkeit zu holen.

War es hilfreich?

Lösung

Wahrscheinlich die AskTom Artikel Ihnen helfen können.

Andere Tipps

Sie können dies nicht tun, ohne Oracle dynamische SQL . Sie müssen Ihre IN-Klausel zur Laufzeit erstellen und EXECUTE IMMEDIATE. Zumindest können Sie Methode 1, basierend auf Abfragen verwenden.

Ich habe eine Tabelle verwendet, vor einer ID und einem Satz von Zeilen zusammengesetzt, wo die Reihen der Permutation der möglichen Werte in der „in“ -Liste sind. Dann schließe ich mich an den Tisch auf der Basis ID und es gibt mir die Ergebnisse, die ich brauche.

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

Alle müssen Sie tun, dann wählen Sie die korrekte „ID“ Wert 2, 3, 4 ... und setzen das in die Beitreten.

... Haupt String: = 'SELECT * FROM Tabelle WHERE id =: uniqid und Sprache in'; - kann in zwei Teile aufgeteilt accomadate: uniqd ... Wählen Sie LANGUAGE_CODE in v_string von x_table; Schleife  Copy & Concat v_string zu LanCode_String und mit '',; Endöse; .. Concat Lancode zur String. .. Vorbereitung und Durchführung des Haupt String.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top