也许这篇文章能帮到你:
建议如果想使用临时表,不要调用"prepareStatement"函数。你可以直接从statement对象中执行查询。
例如:
String sql = "select uuid, name from Component"; Statement stmt = dbCon.createStatement(); ResultSet rs = stmt.executeQuery(sql);
如果您必须调用"prepareStatement",那么您需要创建一个真正的表格,并且如果需要,在之后删除该表格。
executeQuery()方法通常用于返回ResultSet的查询,例如SELECT语句。
executeUpdate()方法用于INSERT、UPDATE、DELETE或DDL语句,这些语句返回更新计数。
JDBC将以上两种(ResultSet和更新计数)均视为“结果”。对于返回多个结果的查询,需要使用execute()调用。
如果存储过程使用临时表,可能会先返回一个更新计数,然后是一个ResultSet。您应该使用execute()运行查询,调用getMoreResults()跳过更新计数,然后调用getResultSet()来获取您想要的ResultSet。问题在于我们必须通过多次调用getMoreResults()来尝试获取我们想要的结果集,这种方式很麻烦。
与其进行试错式的尝试,不如通过指定"SET NOCOUNT ON"来抑制所有额外的“查询结果”。
所需更改:
Put your logic in SP "SPCHILD". This Stored procedure will have logic along with temp table creation.
Create a SP "SPPARENT" as below,
CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL
AS
BEGIN
SET NOCOUNT ON;
EXEC(' SPCHILD @Id = ' + @Id)
END
From parent SP "SPPARENT" you have to call your actual SP i.e. "SPCHILD".
From your JDBC code make a SP call to "SPPARENT".
我也遇到了同样的问题。为了解决这个问题,我将在我的SQL服务器上设置跟踪,查看所有在MS JDBC驱动程序执行实际SP调用之前被执行的语句。这应该可以帮助我搞清楚事情。不幸的是,我们的DBA今天不在,所以我明天要在她的帮助下完成这项工作。我会告诉您发生了什么以及如何修复它。
INSERT
指令是否位于创建临时表的同一存储过程中? - Andriy M