¿Es posible hacer referencia a nombres de columna a través de variables de enlace en Oracle?

StackOverflow https://stackoverflow.com/questions/610056

Pregunta

Estoy tratando de referirme a un nombre de columna para ordenar una consulta en una aplicación que se comunica con una base de datos Oracle. Quiero usar una variable de enlace para poder cambiar dinámicamente la orden de la consulta.

El problema que tengo es que la base de datos parece estar ignorando el orden por columna.

¿Alguien sabe si hay una forma particular de referirse a una columna de base de datos mediante una variable de enlace o si es posible?

por ejemplo, mi consulta es

SELECT * FROM PERSON ORDER BY :1

(donde : 1 estará vinculado a PERSON.NAME ) La consulta no está devolviendo resultados en orden alfabético, me preocupa que la base de datos interprete esto como: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

que obviamente no funcionará.

Cualquier sugerencia es muy apreciada.

¿Fue útil?

Solución

No. No puede utilizar variables de enlace para nombres de tablas o columnas.

Esta información es necesaria para crear el plan de ejecución. Sin saber qué quiere ordenar, sería imposible averiguar qué índice usar, por ejemplo.

En lugar de las variables de enlace, debe interpolar directamente el nombre de la columna en la declaración SQL cuando su programa lo crea. Suponiendo que tome precauciones contra la inyección de SQL, no hay inconveniente en eso.

Actualización: Si realmente quisieras saltar a través de aros, probablemente podrías hacer algo como

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

pero eso es simplemente tonto. Y lento. No.

Otros consejos

Como estás utilizando JDBC. Puedes reescribir tu código, a algo sin variables de enlace. De esta manera, también puede cambiar dinámicamente el orden, por ejemplo:

    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 incluso

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

siempre será una declaración NUEVA a la base de datos. Eso significa que, como ya explicó Thilo, es imposible " reordenar " Una declaración ya enlazada, calculada, preparada, analizada. Cuando utilice este conjunto de resultados una y otra vez en su aplicación y lo único que cambia con el tiempo es el orden de la presentación, intente ordenar el conjunto en el código de su cliente. De lo contrario, el SQL dinámico está bien, pero viene con una gran huella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top