如何解决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()
)。
所有OUT参数的类型必须在执行存储过程之前注册; 通过此处提供的 get 方法在执行后检索它们的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。