【问题标题】:MySQL prepared statement not returning results javaMySQL准备好的语句不返回结果java
【发布时间】: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


    【解决方案1】:

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

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

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

    Documentation:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2014-09-15
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多