使用选择查询和IN CLAUSE的联合的PreparedStatement的问题

时间:2011-04-08 13:29:53

标签: java sql oracle jdbc prepared-statement

我写了一个表格的查询:

select .... where x.y in (?) union select .... where p.y in (?) and a.b not in (?) 

问号表示我在运行时放置多个值的位置(使用preparedStatement.setString()方法动态地将值放入IN子句中。

结果集在执行此查询时似乎忽略了union子句后的查询。 我在任何地方都不例外。

我发布此问题,只是为了知道其他人是否遇到过这样的问题,比如此链接建议UNION of multiple tables and preparedstatement not working 数据库是Oracle 10g,以防万一。

2 个答案:

答案 0 :(得分:1)

据我记忆 - 您无法使用? in运算符,但union支持得很好。

您是否尝试将in替换为=?或者删除union并检查它是否解决了问题?

答案 1 :(得分:1)

你只能使用'?' 单独值的运算符。使用String来设置IN值,你会得到......

SELECT * FROM TABLE WHERE ID IN (?)

......将被视为......

SELECT * FROM TABLE WHERE ID IN ("1,2,3,4")

......在你的情况下。

如果您使用JavaRanch链接中的“选项2”,它将类似..

SELECT * FROM TABLE WHERE ID IN (1, 2, 3, 4)

...我相信你想要的,但是你需要总是提供4个值。如果你少了,你当然可以再次使用其中一个而没有任何不良影响,但是如果你有更多它们,那你就不走运了。

我建议你做的是,动态构建PreparedStatement,使用尽可能多的'?'因为你有in-parameters然后循环并设置它们。这样你就可以结合使用动态查询来清理输入,避免任何SQL注入攻击。