我正在使用MS SQL驱动程序版本3.0 通过标准 JDBC连接执行存储过程。
我发现当我创建数据并将数据插入临时表时,存储过程无法正常执行。
Java代码不会抛出异常,但javax.sql.ResultSet
将是null
。
存储过程中的失败点是我取消对INSERT INTO #TBL CLM_NAME VALUES('VAL')
当我使用 SQL Studio管理器执行语句时,它会毫无困难地执行,并且数据会按预期执行。
有没有人遇到这个或知道为什么会这样?
最初我认为它是因为SQL驱动程序,我仍然认为它是?
感谢。
答案 0 :(得分:13)
建议如果要使用临时表,则不应调用“prepareStatement”。您可以直接从语句对象执行查询。
例如:
String sql = "select uuid, name from Component"; Statement stmt = dbCon.createStatement(); ResultSet rs = stmt.executeQuery(sql);
如果你必须调用“prepareStatement”,那么你需要创建一个真实的表,如果需要,之后删除该表。
答案 1 :(得分:6)
executeQuery()旨在与返回ResultSet的查询一起使用,通常是SELECT语句。
executeUpdate()用于返回更新计数的INSERT,UPDATE,DELETE或DDL语句。
上述两个(ResultSet和更新计数)被JDBC视为“结果”。对于返回多个结果的查询,它需要我们调用execute()。
如果存储过程使用临时表,则可能首先返回更新计数,然后返回ResultSet。您应该使用execute()来运行查询,调用getMoreResults()来跳过更新计数,然后调用getResultSet()来获取您想要的 ResultSet 。这里的问题是我们必须多次调用getMoreResults()来通过调用getResultSet()获取我们想要的结果集来进行反复试验。
您可以通过指定“设置NOCOUNT ON ”来取消所有额外的“查询结果”,而不是上述试错方式。
需要更改,
将您的逻辑放在SP“SPCHILD”中。此存储过程将具有逻辑以及临时表创建。
创建一个SP“SPPARENT”,如下所示,
CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL
AS
BEGIN
SET NOCOUNT ON;
EXEC(' SPCHILD @Id = ' + @Id)
END
从父SP“SPPARENT”您必须拨打您的实际SP,即“SPCHILD”。
从您的JDBC代码中拨打SP“SPPARENT”。
答案 2 :(得分:2)
我也面临同样的问题。为了解决这个问题,我将在我的sql server上设置跟踪,并在执行实际SP调用之前查看MS JDBC驱动程序正在执行的所有语句。这应该可以帮助我清理。不幸的是我们的DBA今天出去所以我明天必须在她的帮助下完成。我会让你知道会发生什么,修复是什么。