Исключение Java SQL отсутствует параметр IN или OUT в index :: 1 - PullRequest
1 голос
/ 10 декабря 2011

Кажется, это частый вопрос, но конкретного ответа нет. Я никогда не сталкивался с проблемой раньше. Код здесь:

public static Reservation retrieveReservation()throws IOException,
   SQLException{
   Reservation testRsv = new Reservation();
   try {
      Connection con = null;

      Class.forName("oracle.jdbc.driver.OracleDriver");
      con=DriverManager.getConnection(
         "jdbc:oracle:thin:@wewe",
         "ewew",
         "sdsds");
      con.setAutoCommit(false);
      try {
         PreparedStatement prepareStatement = con.prepareStatement("SELECT *
         FROM SMD_RESERVATION_INSTANCES WHERE id = ?");
         ResultSet rset = prepareStatement.executeQuery();
         prepareStatement.setString(1, localIDTest);
         prepareStatement.executeUpdate();
         prepareStatement.close();
         con.commit();
         if(rset.next()){
            retrievedID = rset.getString("ID");
            Blob blob = rset.getBlob("RESERVATIONINST");
            status = rset.getString("STATUS");
            long blobLength = blob.length();
            int pos = 1;   // position is 1-based
            int len = 10;
            byte[] bytes = blob.getBytes(pos, len);
            InputStream is = blob.getBinaryStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            testRsv = (Reservation)ois.readObject();
         }

         // System.out.println("Map Size: " + retrievedmap.size());
         rset.close();
         con.close();
      }catch(IOException ioe){
         System.err.print(ioe);
      }
   }catch(ClassNotFoundException cnfe){
      System.err.print(cnfe);
   }
   return testRsv;
}

выдает следующее:

java.sql.SQLException: Missing IN or OUT parameter at index:: 1

Есть идеи, почему? Я перепроверил переменные как параметры, которые являются идентификатором, и они не равны NULL и имеют значение.

Ответы [ 2 ]

4 голосов
/ 10 декабря 2011

Вы должны изменить порядок выписок,

PreparedStatement prepareStatement = con.prepareStatement("SELECT * FROM 
            SMD_RESERVATION_INSTANCES WHERE id = ?");
  prepareStatement.setString(1, localIDTest);
  ResultSet rset = prepareStatement.executeQuery();

удалить эти выписки (не закрывать соединение во время чтения).

prepareStatement.executeUpdate();
prepareStatement.close();
con.commit();
2 голосов
/ 10 декабря 2011

Вы создаете оператор, требующий один параметр, выполняете его и только после этого устанавливаете параметр:

        PreparedStatement prepareStatement = con.prepareStatement("SELECT * FROM 
        SMD_RESERVATION_INSTANCES WHERE id = ?");
        ResultSet rset = prepareStatement.executeQuery();
        prepareStatement.setString(1, localIDTest);

это должно работать:

        PreparedStatement prepareStatement = con.prepareStatement("SELECT * FROM 
        SMD_RESERVATION_INSTANCES WHERE id = ?");
        prepareStatement.setString(1, localIDTest);
        ResultSet rset = prepareStatement.executeQuery();
...