首页 > 解决方案 > MySQL准备好的语句不返回结果java

问题描述

我在 mysql 中有一个简单的存储过程,并试图从 jdbc 调用它。我不断得到一个空的结果集。我已经在类似的线程上搜索并尝试了几种解决方案,但均无济于事。请注意,table.quantity 不是固定小数,这就是我使用 double/BigDecimal 的原因。

我表中的相关列是:

quantity   DOUBLE UNSIGNED
orderTime  TIMESTAMP

这是存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `getTotal`( IN pSince TIMESTAMP, OUT pVolume DOUBLE UNSIGNED )
BEGIN
    SET pVolume = ( SELECT SUM( quantity ) FROM db.table WHERE orderTime > pSince );
END

我也试过这样:

BEGIN
    SELECT SUM( quantity ) INTO pVolume FROM db.table WHERE orderTime > pSince;
END

当我这样称呼它时,似乎都不起作用:

CallableStatement lCall = getConnection().prepareCall( "{call getTotal(?,?)}" );
lCall.setTimestamp( 1, new Timestamp( System.currentTimeMillis() - 600000 ));
lCall.registerOutParameter( 2, Types.DOUBLE );
lCall.execute();
ResultSet lResults = lCall.getResultSet();
lResults.next();
return lResults.getBigDecimal( 1 );

这将返回一个空结果集。

添加lResults.beforeFirst()会引发空指针异常,因为它lResults.rowData是空的。我也试过lResults.getBigDecimal( "pVolume" )同样的结果。

我也试过:

ResultSet lResults = lCall.executeQuery();
lResults.next();
return lResults.getBigDecimal( 1 );

它会抛出一个 SQLException ,lResults.next()因为它说调用是一个 UPDATE ,因此没有任何结果。

我怀疑我的存储过程中遗漏了一些东西。有任何想法吗??哦,我正在以 dev 身份登录,而不是 root。我检查了权限,我可以执行。

标签: javamysqlprepared-statement

解决方案


CallableStatement直接通过其(自己的)声明的方法检索结果:

lCall.execute();
return lCall.getBigDecimal( 2 );
// do not forget to close the statement - try-with-resource

无需致电getResultSet()(来自Statement)。

文档

所有 OUT 参数的类型必须在执行存储过程之前注册;它们的值在执行后通过此处提供的 get 方法检索


推荐阅读