Я пытаюсь обратиться к имени столбца, чтобы упорядочить запрос в приложении, взаимодействующем с базой данных Oracle. Я хочу использовать переменную связывания, чтобы я мог динамически изменять, по чему упорядочивать запрос.
Проблема, с которой я столкнулся, заключается в том, что база данных, похоже, игнорирует порядок по столбцам.
Кто-нибудь знает, есть ли конкретный способ ссылки на столбец базы данных через переменную связывания, или это вообще возможно?
например, мой запрос
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 — это хорошо, но требует огромных усилий.