是否可以通过Oracle中的绑定变量引用列名?

时间:2009-03-04 10:42:17

标签: oracle data-binding jdbc sql-order-by

我正在尝试引用列名来在与Oracle数据库通信的应用程序中排序查询。我想使用绑定变量,以便我可以动态更改查询的顺序。

我遇到的问题是数据库似乎忽略了按列的顺序。

有没有人知道是否有通过绑定变量引用数据库列的特定方法,或者是否可能?

例如我的查询

SELECT * FROM PERSON ORDER BY :1

(其中:1将绑定到PERSON.NAME) 查询不按字母顺序返回结果,我担心数据库将其解释为: -

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

显然不起作用。

非常感谢任何建议。

3 个答案:

答案 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很好,但占用空间很大。