当前位置: 首页 > 知识库问答 >
问题:

JDBC未检测到存储过程异常

丌官瀚
2023-03-14

我正在使用准备好的语句jdbc模板运行一个存储过程:

conn = dbrm.getConnection(this.dataSources.get(aas.getArgumentValue("dataSource")));
Statement stmt = conn.createStatement();
try{
    boolean hasResultSet = stmt.execute(query);
catch(Exception e){
    // log and handle appropriately
}

我的存储过程基本上是一个存储过程调用另外两个存储过程。

我遇到的问题是,如果在存储过程的第一条语句之后有一个异常,那么该异常不会返回到jdbc模板,所以看起来我的存储过程对我的Java代码起作用,即使它没有,这显然是有问题的。

有没有一种方法可以手动检查存储过程的输出或者使所有可能的异常冒泡到Java?

共有1个答案

岳风畔
2023-03-14

似乎在执行存储过程时,引发的异常可能会“排队”在成功的结果后面。为了“检索”异常,我们可能必须使用CallableStatement对象的GetMoreResults方法。

例如,给定存储过程

CREATE PROCEDURE [dbo].[Table1sp] AS
BEGIN
    SET NOCOUNT ON;
    SELECT 123;
    CREATE TABLE #Table1 (textcol VARCHAR(50) PRIMARY KEY);
    INSERT INTO #Table1 (textcol) VALUES (NULL);  -- error here
END

如果我们运行Java密码

String connectionUrl = "jdbc:sqlserver://localhost:52865;"
        + "databaseName=myDb;" + "integratedSecurity=true";
try (Connection conn = DriverManager.getConnection(connectionUrl)) {
    try (CallableStatement cs = conn.prepareCall("{call Table1sp}")) {
        cs.execute();
        ResultSet rs = cs.getResultSet();
        rs.next();
        System.out.println(rs.getInt(1));
        rs.close();
    }
} catch (Exception e) {
    e.printStackTrace(System.err);
}

然后,我们只需打印值123,我们的代码就会继续运行,就好像什么都没有发生一样。

但是,如果我们使用getMoreResults()调用进行后续操作...

String connectionUrl = "jdbc:sqlserver://localhost:52865;"
        + "databaseName=myDb;" + "integratedSecurity=true";
try (Connection conn = DriverManager.getConnection(connectionUrl)) {
    try (CallableStatement cs = conn.prepareCall("{call Table1sp}")) {
        cs.execute();
        ResultSet rs = cs.getResultSet();
        rs.next();
        System.out.println(rs.getInt(1));
        rs.close();

        try {
            cs.getMoreResults();
        } catch (com.microsoft.sqlserver.jdbc.SQLServerException ex) {
            System.out.println("SQLServerException: " + ex.getMessage());
        }

    }
} catch (Exception e) {
    e.printStackTrace(System.err);
}

...然后捕获异常:

123
SQLServerException: Cannot insert the value NULL into column 'textcol', table 'tempdb.dbo.#Table1 ...
 类似资料:
  • 主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O

  • 我创建了一个存储过程,如下所示: //mysql中的存储过程 并且我正在调用Java中的存储过程,如下所示: //使用JDBC调用存储过程 但它显示了一个编译时异常,如下所示: CAN在参数中为存储的函数调用的返回值设置。

  • 我是使用JDBC和MariaDB创建存储过程的初学者。当我创建过程时,我得到一个错误。我从昨天开始就遇到了这个问题: 到目前为止,我尝试了以下代码。我不知道是什么原因造成了这个错误。

  • 问题内容: 我有一个存储过程,可以进行备份,然后在出现错误或不是这样的情况下返回1或0: 在sql中,它可以正常工作并返回@answer的正确值。 在php中,当我尝试获取查询的执行时,它什么也找不到。 PDO的属性 我得到这个错误: r:“ SQLSTATE [IMSSP]:查询的活动结果不包含任何字段。” 我希望:答案:1 问题答案: 说明: 错误的原因是返回参考消息,并且您的存储过程具有多个

  • 这件事困扰了我很久,所以我想在这里得到一些帮助:) 我正在使用JDBC连接到一个老旧的Sybase Adaptive server 6(!!!)我甚至在网上找不到它的JDBC驱动程序,所以我从安装目录中复制了它们:) 现在,插入和查询以及所有其余的db操作都工作得很好,但是我在调用存储过程时遇到了问题。让我们首先从一段代码开始: 提前道谢!/IVO

  • 我有一个非常复杂的oracle存储过程,它搜索和检索一些数据。该过程返回一个输出参数-oracle游标。我通过JDBC执行过程: 问题是,查询有时会花费相当长的时间(几分钟),我希望用户能够通过单击按钮随时取消查询。我引用了stmt对象,但不幸的是(从其他线程)调用stmt.cancel()没有效果。 另一方面,当我将CallableStatement sql更改为以下查询时: 在调用stmt.c