Можно ли ссылаться на имена столбцов через переменные bind в Oracle?

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

Вопрос

Я пытаюсь сослаться на имя столбца, чтобы упорядочить запрос в приложении, взаимодействующем с базой данных Oracle.Я хочу использовать переменную bind, чтобы я мог динамически изменять порядок выполнения запроса.

Проблема, с которой я сталкиваюсь, заключается в том, что база данных, похоже, игнорирует порядок по столбцам.

Кто-нибудь знает, есть ли определенный способ ссылаться на столбец базы данных через переменную bind или это вообще возможно?

например, мой запрос таков

SELECT * FROM PERSON ORDER BY :1

(где :1 будет связан с PERSON.NAME) Запрос не возвращает результаты в алфавитном порядке, я обеспокоен тем, что база данных интерпретирует это как:-

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

что, очевидно, не сработает.

Мы очень ценим любые предложения.

Это было полезно?

Решение

Нет.Вы не можете использовать переменные привязки для имен таблиц или столбцов.

Эта информация необходима для создания плана выполнения.Не зная, по чему вы хотите сделать заказ, было бы невозможно, например, определить, какой индекс использовать.

Вместо привязки переменных вы должны напрямую интерполировать имя столбца в инструкцию SQL, когда ваша программа создает его.Предполагая, что вы принимаете меры предосторожности против SQL-инъекции, в этом нет никаких недостатков.

Обновить: Если бы вы действительно хотели прыгать через обручи, вы, вероятно, могли бы сделать что-то вроде

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

но это просто глупо.И медленный.Не надо.

Другие советы

Как вы используете JDBC. Вы можете переписать свой код, чтобы что-то без переменных связывания. Таким образом, вы также можете динамически изменять порядок, например:

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

Или даже

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

всегда будет новым оператором для базы данных. Это означает, что, как Тило уже объяснил, невозможно «изменить порядок»; уже связанное, рассчитанное, подготовленное, проанализированное заявление. При использовании этого результирующего набора снова и снова в вашем приложении, и единственное, что меняется со временем, - это порядок презентации, попробуйте упорядочить набор в вашем клиентском коде. В противном случае динамический SQL - это хорошо, но требует огромных усилий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top