【问题标题】:Escaping single quotes in table SQL queries在表 SQL 查询中转义单引号
【发布时间】:2010-10-01 21:28:40
【问题描述】:

使用java.sql.Preparedstatement 意味着在解析查询时会进行字符转义,当我的数据中有单引号但当我的表名本身有单引号时查询不起作用(我我正在使用 Oracle 11g)。

这是我的代码:

Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(
    "jdbc:oracle:thin:client/adept@ind-db-02:1521:ind02");

PreparedStatement preparedStatement = con.prepareStatement(
    "SELECT * FROM (?) where rownum=1");

preparedStatement.setString(1,"CLIENT.\"SR'tab\"");
ResultSet rs3=preparedStatement.executeQuery();

有没有办法使用准备好的语句从表名中转义单引号?

【问题讨论】:

  • 为什么表名中有引号?
  • 我无法控制表名称,它是 ETL 过程的一部分,需要从第三方数据源加载数据

标签: java jdbc


【解决方案1】:

PreparedStatement 占位符不适用于表名或列名,它们仅用于实际列值。换句话说,您实际上是在滥用 PreparedStatement。

另见

【讨论】:

  • Deja vuhere :)
  • @BalusC 是的,确实,我承认 :)
【解决方案2】:

我建议您现在更改这些表名,以防止将来出现痛苦。我们都使用的高性能工具非常棒,但是当一种颜色超出界限时,痛苦将永无止境。

【讨论】:

    【解决方案3】:

    虽然使用绑定参数向数据库传递数据是非常正确的,但是表名不能使用绑定参数。

    在这种情况下,正确引用它应该足够了。

    例如(未经测试):

    PreparedStatement preparedStatement=
      con.prepareStatement("SELECT * FROM \"CLIENT.SR'tab\" where rownum=1"); 
    

    【讨论】:

    • 这不适用于表名的正确引号。我已经尝试过了,我怀疑这个 escapeProcessing 的原因是打开,当我禁用 escapeProcessing(JDBC 级别)+ 正确引用然后查询工作正常
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多