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 );
它会抛出一个 SQLException ,lResults.next()
因为它说调用是一个 UPDATE ,因此没有任何结果。
我怀疑我的存储过程中遗漏了一些东西。有任何想法吗??哦,我正在以 dev 身份登录,而不是 root。我检查了权限,我可以执行。
解决方案
CallableStatement
直接通过其(自己的)声明的方法检索结果:
lCall.execute();
return lCall.getBigDecimal( 2 );
// do not forget to close the statement - try-with-resource
无需致电getResultSet()
(来自Statement
)。
文档:
所有 OUT 参数的类型必须在执行存储过程之前注册;它们的值在执行后通过此处提供的 get 方法检索。
推荐阅读
- arrays - 在执行 array.map 之后也检索其他项目属性
- postgresql - 针对值列表的 Ecto 连接语法
- firebase - Cloud Functions 中的 Firestore runTransaction 第一次调用大约需要 5 秒
- javascript - javascript中的构造函数也是对象吗?
- msvcrt - 寻找 mac 的 msvcrt 库替代品
- python - 将列表写入excel中的特定列
- java - 如何从文本文件java中读取数字和字母的组合
- sas - 如何构建具有多个分类变量的决策树分类模型?
- regression - 将 100 个变量添加到 lm() 中的正确方法
- sql - SQL 错误:“ORA-00947:没有足够的值”