微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL准备好的语句不返回结果java

如何解决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 );

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

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

解决方法

来自 zend_extension = /opt/lampp/lib/php/extensions/no-debug-non-zts-20200930/xdebug.so xdebug.mode = debug xdebug.start_with_request = yes xdebug.client_port = 9000 的结果通过其(自己的)声明的方法直接检索:

CallableStatement

无需调用 lCall.execute(); return lCall.getBigDecimal( 2 ); // do not forget to close the statement - try-with-resource (来自 getResultSet())。

Documentation

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。