Domanda

Ho un problema con un Pro*C query sto cercando di ottimizzare.

Per spiegare la nostra applicazione ricerca righe in un enorme database.Queste righe esiste in diverse lingue e il vecchio codice selezionato una riga per ogni lingua in un array.Ora come queste query sono più tempo parte della nostra app, ho voluto fare solo una query che scrive direttamente in un array.

I codici di lingua sono 2 lettera codici ISO 639 (en per l'inglese, fr per la francia).

Vecchio modo (questo è solo un codice semplificato per mostrare l'intenzione)

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

Vorrei fare qualcosa di simile a questo:

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

ma non so come dovrei definire LanCodes.

Funziona con una costante (di compilazione) lista come questa

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

ma questo non è utile, come le lingue possono variare da caso a caso.

Se scrivo qualcosa di simile

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

funziona solo se c'è 1 lingua di codice nella stringa.

Quindi la mia domanda è, qualcuno di voi sa come fare questo lavoro?La documentazione di Oracle è così grande, non so dove guardare.Ho provato diversi modi, ma nessuno ha funzionato.

MODIFICA Ok, ho trovato una soluzione che funziona.Non è elegante, non è avanzata, ma funziona bene.Ho messo una lista di clausole or nella mia query e restituisce ciò di cui ho bisogno nella forma di cui ho bisogno.

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

E ' più veloce quando c'è più di 2 lingue, in modo che io chiamo questa variante o vecchio, e in base al numero di lingue da scaricare.

È stato utile?

Soluzione

Probabilmente questo AskTom articolo può aiutare.

Altri suggerimenti

Non si può fare questo senza Oracle SQL Dinamico.Dovrete costruire il vostro clausola in fase di esecuzione e di ESECUZIONE IMMEDIATA.Almeno si può utilizzare il Metodo 1, basato su query.

Ho usato una tabella composta da un ID e una serie di righe in cui le righe sono la permutazione dei valori possibili in elenco "in".Quindi mi unisco al tavolo della ID e mi dà i risultati di cui ho bisogno.

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

Tutto quello che dovete fare è scegliere la giusta "ID" valore 2, 3, 4 ...e inserito nel join.

...Principali Stringa:= "Select * FROM tabella WHERE id=:uniqid E lingua';-- può dividere in due per ospitare :uniqd ...Selezionare Language_code in v_string da x_table;loop Copia & Concat v_string per LanCode_String e con ' ', ;end loop;..Concat Lancode di Stringa Principale...Preparare ed eseguire la Stringa Principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top