2017-10-15 61 views
0

我有一个列表对象和IM发送到SQL查询作为数字常量无效在SQL

UPDATE <table name> SET status= 'CLOSED' WHERE dlno IN ("+StringUtils.join(deals, ',')+") "; 

我的交易对象如下

1549886508071HELMPFN 

我怎么能在这里传递一个字符串

[SQL0103] Numeric constant 1549886508071HELMPFN not valid. 
+4

你必须用'''' – lad2025

+0

'StringUtils.join()'使我想到“java”,所以我添加了它作为标签。问题实际上是关于应用程序语言而不是SQL。 –

回答

1

字符串常量需要用单引号引起来。在你的情况下,这看起来像:

UPDATE <table name> 
    SET status = 'CLOSED' 
    WHERE dlno IN ('"+StringUtils.join(deals, "', '") +"') "; 
1

使用绑定变量将解决您的报价问题,使你的代码针对SQL注入安全:

List<String> deals = ImmutableList.of("abc", "123", "def"); 
    StringBuilder questionMarks = new StringBuilder("?"); 
    for (int i=1;i<deals.size();i++) { 
     questionMarks.append(",?"); 
    } 
    Connection conn = ...; // presumably, you already have this 
    PreparedStatement stmt = conn.prepareStatement(
      "UPDATE my_table SET status= 'CLOSED' WHERE dlno IN (" + questionMarks + ")"); 
    for (int i=1;i<=deals.size();i++) { // note these are 1-indexed, not 0-indexed 
     stmt.setString(i, deals.get(i-1)); 
    } 
    stmt.executeUpdate(); 

基本上,你会生成一个查询,说UPDATE my_table SET status = 'CLOSED' WHERE dlno IN (?,?) (问号的数量对应于参数的数量),然后您将用stmt.setString更新它们。然后你可以执行你的更新。

另请注意,您需要处理SQLException s并关闭声明。为清晰起见,此处删除。