我可以在 JDBC 准备查询中使用多个语句吗?

Posted

技术标签:

【中文标题】我可以在 JDBC 准备查询中使用多个语句吗?【英文标题】:Can I use multiple statements in a JDBC prepared query? 【发布时间】:2011-03-22 22:10:44 【问题描述】:

我想在我的 mysql 服务器上执行类似的操作:

SET @id=(SELECT id FROM lookupTable WHERE field=?);
(SELECT * FROM table2 WHERE id=@id)
UNION
(SELECT * FROM table3 WHERE id=@id)
UNION
(SELECT * FROM table4 WHERE id=@id);

这在控制台上运行良好,但在我的 Java PreparedStatement 中却不行。它在“;”处抛出一个带有语法错误的异常分隔语句。我喜欢这个变量,因为我不必重复查找子句,但如有必要我可以重写它。等效的 JOIN 与 UNION 子句也有点尴尬。

谢谢,

约书亚

【问题讨论】:

正如@ddimitrov 所说,这似乎直接不可能。我没有尝试PreparedStatement.addBatch()。存储过程也可能适用于此。 如果您对其他供应商感兴趣,那么 CUBRID 数据库支持此功能。请参阅此论坛帖子cubrid.org/forum/534638。 【参考方案1】:

JDBC 从未支持解析分隔查询。每次调用都是对数据库的一次访问。也许你可以实现你想要为每个单独的查询执行 PreparedStatement.addBatch(),然后执行和检索两个结果集?

【讨论】:

【参考方案2】:

仅将其作为两个单独的查询(在一个连接中)运行应该会得到相同的结果。

【讨论】:

本来希望能避免两次网络时间,但这里似乎无法避免。也许这是避免 SQL 注入的安全功能。 @Joshua,您可以批量查询服务器,避免多次网络行程。

以上是关于我可以在 JDBC 准备查询中使用多个语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysqli:它可以在一个语句中准备多个查询吗?

使用 MySQL 和 JDBC 准备语句缓存

使用准备好的语句查询列表 (JDBC)

LIKE 中的单引号到 JDBC 准备语句中

我们可以使用 IN 语句在多个查询中分解 SQL 连接吗

准备好的语句中的占位符