Est-il possible de faire référence à des noms de colonne via des variables de liaison dans Oracle?

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

Question

J'essaie de faire référence à un nom de colonne pour commander une requête dans une application communiquant avec une base de données Oracle. Je souhaite utiliser une variable de liaison afin de pouvoir modifier de manière dynamique le processus de commande de la requête.

Le problème que je rencontre est que la base de données semble ignorer l'ordre de colonne.

Est-ce que quelqu'un sait s'il existe un moyen particulier de se référer à une colonne de base de données via une variable bind ou si c'est même possible?

Par exemple, ma requête est

.
SELECT * FROM PERSON ORDER BY :1

(où : 1 sera lié à PERSON.NAME ) La requête ne renvoie pas les résultats par ordre alphabétique, je crains que la base de données l’interprète comme suit: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

qui ne fonctionnera évidemment pas.

Toutes les suggestions sont très appréciées.

Était-ce utile?

La solution

Non. Vous ne pouvez pas utiliser de variables de liaison pour les noms de table ou de colonne.

Cette information est nécessaire pour créer le plan d'exécution. Sans savoir par quoi vous voulez commander, il serait impossible de déterminer quel index utiliser, par exemple.

Au lieu de lier des variables, vous devez interpoler directement le nom de la colonne dans l’instruction SQL lorsque votre programme le crée. En supposant que vous preniez des précautions contre l’injection SQL, il n’ya aucun inconvénient à cela.

Mise à jour : si vous souhaitez vraiment franchir des obstacles, vous pouvez probablement faire quelque chose comme

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

mais c'est juste idiot. Et lent. Ne pas.

Autres conseils

Comme vous utilisez JDBC. Vous pouvez réécrire votre code, en quelque chose sans variables de liaison. De cette façon, vous pouvez également modifier dynamiquement l'ordre, par exemple:

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

Ou même

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

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

sera toujours une instruction NEW dans la base de données. Cela signifie qu'il est, comme Thilo l'a déjà expliqué, impossible de "réorganiser" une déclaration déjà liée, calculée, préparée, analysée. Lorsque vous utilisez ce jeu de résultats à plusieurs reprises dans votre application et que la seule chose qui change avec le temps est l'ordre de la présentation, essayez de commander le jeu dans votre code client. Sinon, le SQL dynamique convient, mais son encombrement est énorme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top