sql >> データベース >  >> RDS >> Mysql

MySql Connector / Jのエラーメッセージがわかりにくい-java.sql.SQLException:boo {exclamation mark}

    質問の更新で述べたように、これは通常、CallableStatementを誤って使用したことが原因です。例:

    ストアドプロシージャは、入力と出力の2つのパラメータを使用します。

    CREATE DEFINER=`example`@`localhost` PROCEDURE `sp_getSensorLocation`(IN in_id VARCHAR(128), OUT loc VARCHAR(128))
    BEGIN
    SELECT LOCATION INTO loc FROM table.SENSORS
    WHERE ID = in_id;
    END
    

    しかし、それへの呼び出しは1のみを使用します:

    private String getSensorLocation(String sensorID) {    
        String location = "";
        Connection c = dbr.getConnection();
        String prepStatement = "{ call sp_getSensorLocation(?) } ";
        try {
             callableStatement cs = c.prepareCall(prepStatement);
             cs.setString(1, sensorID);
             ResultSet rs = cs.executeQuery();
             if (rs.next()) {
                location = rs.getString(1);
                }
             } catch (SQLException ex) {
                    LOG.error("Error:", ex);
             }        
        dbr.closeConnection(c, rs, cs);
        return location;
    }
    

    正しいコードが実際にある場合:

    private String getSensorLocation(String sensorID) {
        String location = "";
        Connection c = dbr.getConnection();
        String prepStatement = "{ call sp_getSensorLocation(?, ?) } ";
        try {
            CallableStatement cs = c.prepareCall(prepStatement);
            cs.setString(1, sensorID);
            cs.execute();
            location = cs.getString(2);            
        } catch (SQLException ex) {
            LOG.error("Error:", ex);
        }
        dbr.closeConnection(c, rs, cs);
        return location;
    }
    

    結果セットを期待しておらず、これにも問題があるため、cs.executeにも変更したことに注意してください(例は、私が修正している他の誰かのコードから取られています、喜び-_-)




    1. HibernateOracleシーケンスは大きなギャップを生成します

    2. 重複するSQLレコードを削除して、一意のキーを許可する

    3. スプリングブートWebアプリは、しばらくするとMySQL/RDSに接続できなくなります

    4. 正規表現はPostgresで検索して置換します