【发布时间】:2021-08-02 06:53:55
【问题描述】:
我在 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。我检查了权限,我可以执行了。
【问题讨论】:
标签: java mysql prepared-statement