Domanda

Sto cercando di fare riferimento al nome di una colonna per ordinare una query in un'applicazione che comunica con un database Oracle. Voglio usare una variabile di bind in modo da poter cambiare dinamicamente da cosa ordinare la query.

Il problema che sto riscontrando è che il database sembra ignorare l'ordine per colonna.

Qualcuno sa se esiste un modo particolare per fare riferimento a una colonna del database tramite una variabile di bind o se è persino possibile?

ad esempio la mia query è

SELECT * FROM PERSON ORDER BY :1

(dove : 1 sarà associato a PERSON.NAME ) La query non restituisce i risultati in ordine alfabetico, sono preoccupato che il database lo stia interpretando come: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

che ovviamente non funzionerà.

Eventuali suggerimenti sono molto apprezzati.

È stato utile?

Soluzione

No. Non puoi utilizzare le variabili di bind per i nomi di tabelle o colonne.

Queste informazioni sono necessarie per creare il piano di esecuzione. Senza sapere da cosa vuoi ordinare, sarebbe impossibile capire quale indice usare, ad esempio.

Invece di associare le variabili, devi interpolare direttamente il nome della colonna nell'istruzione SQL quando il programma lo crea. Supponendo che prendiate precauzioni contro l'iniezione di SQL, non vi è alcun aspetto negativo.

Aggiornamento: se volessi davvero saltare attraverso i cerchi, probabilmente potresti fare qualcosa del genere

order by decode(?, 'colA', colA, 'colB', colB)

ma è sciocco. E lento. Non farlo.

Altri suggerimenti

Come stai usando JDBC. Puoi riscrivere il tuo codice su qualcosa senza variabili di bind. In questo modo puoi anche cambiare dinamicamente l'ordine, ad es .:

    String query = "SELECT * FROM PERS ";
    if (condition1){
      query = query+ " order by name ";
    // insert more if/else or case statements
    } else {
      query = query+ " order by other_column ";
    }
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery(query);

O anche

    String columnName = getColumnName(input);
    Statement select = conn.createStatement();
    ResultSet result = select.executeQuery("SELECT * FROM PERS ORDER BY "+columnName);

ResultSet result = select.executeQuery (" SELECT * FROM PERS ORDER BY " + columnName);

sarà sempre una NUOVA istruzione per il database. Ciò significa che, come già spiegato da Thilo, è impossibile "riordinare". un'istruzione già associata, calcolata, preparata, analizzata. Quando si utilizza questo set di risultati più volte nell'applicazione e l'unica cosa che cambia nel tempo è l'ordine della presentazione, provare a ordinare il set nel codice client. Altrimenti, SQL dinamico va bene, ma ha un ingombro enorme.

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