Можно ли ссылаться на имена столбцов через переменные связывания в Oracle? - PullRequest
4 голосов
/ 04 марта 2009

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

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

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

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

SELECT * FROM PERSON ORDER BY :1

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

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

что явно не сработает.

Любые предложения приветствуются.

Ответы [ 3 ]

7 голосов
/ 04 марта 2009

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

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

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

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

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

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

2 голосов
/ 04 марта 2009

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

    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);
0 голосов
/ 05 марта 2009

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

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

...