有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JDBC和null ResultSet的java临时表

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

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

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

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

当我使用SQL Studio Manager执行语句时,它执行起来没有任何麻烦,数据也没有达到预期效果

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

起初我认为这是因为SQL驱动程序,现在我仍然认为是吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    也许this will help

    It is recommended that if you want to use temp tables, you should not call "prepareStatement". You can directly execute the query from the statement object.

    For example:

    String sql = "select uuid, name from Component";
    
    Statement stmt = dbCon.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    

    If you must call "prepareStatement", then you will need to create a real table and, if needed, delete the table afterwards.

  2. # 2 楼答案

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

  3. # 3 楼答案

    executeQuery()用于返回结果集(通常是SELECT语句)的查询

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

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

    若存储过程使用临时表,则可能首先返回更新计数,然后返回结果集。您应该使用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调用