簡體   English   中英

MySQL 准備好的語句不返回結果 java

[英]MySQL prepared statement not returning results 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()會引發 null 指針異常,因為lResults.rowData是 null。 我也試過lResults.getBigDecimal( "pVolume" )得到相同的結果。

我也試過:

ResultSet lResults = lCall.executeQuery();
lResults.next();
return lResults.getBigDecimal( 1 );

它會在lResults.next()上引發 SQLException,因為它說調用是 UPDATE,因此沒有任何結果。

我懷疑我的存儲過程中遺漏了一些東西。 有任何想法嗎?? 哦,我正在以 dev 身份登錄,而不是 root。 我檢查了權限,我可以執行。

CallableStatement的結果通過其(自己的)聲明的方法直接檢索:

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

無需調用getResultSet() (來自Statement )。

文檔

所有 OUT 參數的類型必須在執行存儲過程之前注冊; 它們的值在執行后通過此處提供的 get 方法檢索

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM