【问题标题】:Temporary tables using JDBC with null ResultSet使用带有空 ResultSet 的 JDBC 的临时表
【发布时间】:2011-06-11 08:08:52
【问题描述】:

我正在使用 MS SQL 驱动程序 3.0 版通过标准 JDBC 连接执行存储过程

我发现当我创建数据并将数据插入临时表时,存储过程无法正常执行。

Java 代码不会抛出异常,但 javax.sql.ResultSet 将是 null

存储过程中的失败点是我取消注释INSERT INTO #TBL CLM_NAME VALUES('VAL')

当我使用 SQL Studio 管理器 执行该语句时,它会毫不费力地执行并且数据符合预期。

有没有人遇到过这种情况或知道为什么会这样?

一开始我以为是因为 SQL 驱动,现在还是这样?

谢谢。

【问题讨论】:

  • 你能确定你正在创建和加载临时表并在同一个连接中读取它吗?
  • 是的,临时表是从我创建的存储过程中创建的。我只从 Java 代码中调用存储过程,例如 connect.executeQuery("{procName(?)}")。
  • 违规的INSERT 指令是否位于创建临时表的同一存储过程中?
  • 你使用哪种方法调用存储过程?

标签: java sql-server-2005 jdbc temp-tables


【解决方案1】:

也许this will help:

如果要使用临时表,建议不要调用“prepareStatement”。您可以直接从语句对象执行查询。

例如:

String sql = "select uuid, name from Component";

Statement stmt = dbCon.createStatement();
ResultSet rs = stmt.executeQuery(sql);

如果您必须调用“prepareStatement”,那么您将需要创建一个真实的表,如果需要,之后删除该表。

【讨论】:

【解决方案2】:

我也面临同样的问题。为了解决这个问题,我将在我的 sql 服务器上设置一个跟踪,并在执行实际的 SP 调用之前查看 MS JDBC 驱动程序正在执行的所有语句。这应该可以帮助我弄清楚事情。不幸的是,我们的 DBA 今天不在,所以我明天必须在她的帮助下完成。我会让你知道发生了什么以及解决方法是什么。

【讨论】:

  • 我放弃了,用子查询代替了临时表或表变量。
【解决方案3】:

executeQuery() 旨在用于返回 ResultSet 的查询,通常是 SELECT 语句。

executeUpdate() 用于返回更新计数的 INSERT、UPDATE、DELETE 或 DDL 语句。

上述两个(结果集和更新计数)都被 JDBC 视为“结果”。对于返回多个结果的查询,我们需要调用 execute()。

如果存储过程使用临时表,它可能首先返回一个更新计数,然后是一个 ResultSet。您应该使用 execute() 来运行查询,调用 getMoreResults() 跳过更新计数,然后调用 getResultSet() 来获取 您想要的结果集。这里的问题是我们必须通过多次调用 getMoreResults() 来进行反复试验,以通过调用 getResultSet() 来获取我们想要的结果集。

您可以通过指定“SET NOCOUNT ON”来抑制所有额外的“查询结果”,而不是上述的反复试验方式。

需要更改,

  1. 将您的逻辑放入 SP“SPCHILD”中。此存储过程将具有逻辑以及临时表的创建。

  2. 如下创建一个SP“SPPARENT”,

     CREATE PROCEDURE [dbo].[SPPARENT]    @Id int = NULL
     AS
     BEGIN
     SET NOCOUNT ON;
     EXEC(' SPCHILD @Id = ' + @Id)
     END
    

    您必须从父 SP“SPPARENT”调用您的实际 SP,即“SPCHILD”。

  3. 从您的 JDBC 代码对“SPPARENT”进行 SP 调用。

【讨论】:

  • 很好的答案!也适用于声明表临时表。
  • 很好的答案!我爱你!
猜你喜欢
  • 2014-02-18
  • 2023-03-24
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2017-01-04
  • 2015-02-05
  • 1970-01-01
相关资源
最近更新 更多