我正在尝试引用列名来在与Oracle数据库通信的应用程序中排序查询。我想使用绑定变量,以便我可以动态更改查询的顺序。
我遇到的问题是数据库似乎忽略了按列的顺序。
有没有人知道是否有通过绑定变量引用数据库列的特定方法,或者是否可能?
例如我的查询
SELECT * FROM PERSON ORDER BY :1
(其中:1
将绑定到PERSON.NAME
)
查询不按字母顺序返回结果,我担心数据库将其解释为: -
SELECT * FROM PERSON ORDER BY 'PERSON.NAME'
显然不起作用。
非常感谢任何建议。
答案 0 :(得分:6)
没有。您不能对表名或列名使用绑定变量。
创建执行计划需要此信息。如果不知道你想要订购什么,就不可能弄清楚要使用什么索引,例如。
在程序创建时,必须直接将列名插入到SQL语句中,而不是绑定变量。假设您采取了针对SQL注入的预防措施,那就没有任何缺点。
更新:如果你真的想跳过篮球,你可能会做类似的事情
order by decode(?, 'colA', colA, 'colB', colB)
但这只是愚蠢的。而且很慢。不。
答案 1 :(得分:2)
当您使用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);
答案 2 :(得分:0)
ResultSet result = select.executeQuery(“SELECT * FROM PERS ORDER BY”+ columnName);
将始终是数据库的新声明。这意味着,就像Thilo已经解释的那样,它不可能“重新排序”已经绑定,计算,准备,解析的语句。在应用程序中反复使用此结果集时,唯一随时间变化的是演示文稿的顺序,请尝试在客户端代码中对该集进行排序。否则,动态SQL很好,但占用空间很大。