简体   繁体   中英

MySQL Java stored procedure gives error "Parameter index of 1 is out of range"

public static void main(String[] args) throws Exception {
        Connection connection = getMySqlConnection();
        CallableStatement proc = connection.prepareCall("{ call LCD_GetDispInfoAllTimeTable() }");
        proc.registerOutParameter(1, Types.INTEGER);
        proc.execute();
        int returnValue = proc.getInt(1);
        System.out.println(returnValue + "");
//      conn.close();
      }


      public static Connection getMySqlConnection() throws Exception {
        String driver = "com.mysql.jdbc.Driver";
        String url = "";
        String username = "";
        String password = "";

        Class.forName(driver);
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
      }
    }

When I run this code I see a Exception in thread "main" java.sql.SQLException: Parameter index of 1 is out of range (1, 0) , why ?

This procedure return :

Niemstów 07 pętla   10  05:33:00    3673114 11558169    754378  1
NŻ Niemstów 05  16  05:35:00    3669905 11556510    754379  3
NŻ Niemstów 03  16  05:37:00    3666969 11555665    754380  3

My procedure ;

CREATE DEFINER=`root`@`%` PROCEDURE `LCD_GetDispInfoAllTimeTable`()
BEGIN

    SELECT bs.name as bsName, tt.busstoptype as bsType, tt.time as ttTime, bs.longitude as lon, bs.latitude as lat, tt.timetable_id as ttID, 
    Bus_Stop_Status_GET( tt.timetable_id, bst.timetable_id, bst.busstate_id ) as bus_stop_status -- 0 zrobiony, 1 - aktualny, 2- pomiędzy, 3 następne
    FROM (SELECT * FROM  mpk_currentbusstate ORDER BY changestime desc LIMIT 1 )bst
    join mpk_timetable t ON( bst.timetable_id = t.timetable_id )
    join mpk_timetable tt ON ( t.linelogin_id  = tt.linelogin_id AND t.line_id = tt.line_id AND t.brigade = tt.brigade AND t.rate = tt.rate 
        and t.schedudle_id = tt.schedudle_id)
    LEFT JOIN mpk_busstop bs ON (bs.busstop_id = tt.busstop_id)
    LEFT JOIN mpk_busstate bt ON( bst.busstate_id = bt.busstate_id );

END

You need to specify the parameter in your call String:

CallableStatement proc = connection.prepareCall("{ call LCD_GetDispInfoAllTimeTable(?) }");

Notice that ? , it says that there is a parameter to be set. Now it knows that there is a parameter to be set, just like methods in Java or some other language. If you wanted to use multiple parameters you can write multiple ? , like: ...LCD_GetDispInfoAllTimeTable(?, ?, ?) .

as far as your procedecure declaration is concerned, its code is:

 CREATE DEFINER=`root`@`%` PROCEDURE `LCD_GetDispInfoAllTimeTable`()
 BEGIN
 SELECT bs.name as bsName, tt.busstoptype as bsType, tt.time as ttTime,
 bs.longitude as lon, bs.latitude as lat, tt.timetable_id as ttID, 
 Bus_Stop

where the procedure definition does NOT contain any parameter definition, so setParameter or registerOutParameter, cannot be applied for this procedure

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM