Oracle JDBC where i nieprawidłowy wynik zapytania

Oracle JDBC where i nieprawidłowy wynik zapytania
Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

Kod:

Kopiuj
public int myMethod(String day) throws SQLException{
  String sql = "Select count(*) from MyTable WHERE someColumn = ? ";
  Connection connection = ConnFactory.get();
  PreparedStatement prepareStatement = null;
  ResultSet resultSet = null;
  int ret = -1;
  try{
      prepareStatement = connection.prepareStatement(sql);
      prepareStatement.setString(1, day);
      resultSet = prepareStatement.executeQuery(sql);
      if(resultSet.next()){
          ret = resultSet.getInt(1);
      }
  }
  catch(SQLException sqle){
      // closing statement & ResultSet, log and throw exception
  }
  finally{
     // closing statement & ResultSet
  }
  ConnFactory.kill(connection);

  return ret;
}

Wynik wywołania 0. Prawidłowy wynik około 100. Jeżeli usunę klauzulę WHERE to zaczyna zwracać prawidłowe wyniki. Czy ktoś może mi powiedzieć dlaczego się tak dzieje?

Freakman
  • Rejestracja: dni
  • Ostatnio: dni
0

a jakie przykladowe wartosci ma day?

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

na przykład 20090311 format YYYYMMDD kolumna jest typu NUMBER. Dlaczego tak? Nie pytaj, bo nie wiem.

Freakman
  • Rejestracja: dni
  • Ostatnio: dni
0

nie wali żadnym errorem o typie kolumny?

spróbuj może setObject(1, day) zamiast setString. Ewentualnie - co głupio zabrzmi - zparsuj ten ciąg na Integera i daj setInt (jestem zmuszony pisać ostatnio pod javą 1.4 stąd te dziwne pomysly ; ))

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

Błędów brak. Próbowałem z setObject i setInt i nadal nic...

  • Rejestracja: dni
  • Ostatnio: dni
0

Trochę ten kod mi się nie podoba ale...

  1. Czy zapytanie na pewno działa
  2. Czy nie powinnieneś zacząć od 0 w setString( 0, day ) ?
__krzysiek85
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1019
0

A co daje wpisane bezpośrednio
Select count(*) from MyTable WHERE someColumn=20090311
?

Jeżeli MyTable ma klucz główny (id), to spróbuj jeszcze:
Select count(id) from MyTable WHERE someColumn=20090311

Usuń też spacje wokół '='

getInt() zwraca też 0, gdy zapytanie zwróciło NULLa.

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

@__krzysiek85, bezpośrednie zapytanie działa poprawnie przez SQLDevelopera. Co do spacji to nie ma znaczenia.

@gosc, zgodnie z dokumentacją:

void setInt(int parameterIndex,
int x)
throws SQLException

Sets the designated parameter to the given Java int value. The driver converts this to an SQL INTEGER value when it sends it to the database.

Parameters:
    parameterIndex - the first parameter is 1, the second is 2, ...
    x - the parameter value

Zatem jest dobrze.

Freakman
  • Rejestracja: dni
  • Ostatnio: dni
0

a jaka to baza? Oracle?

//edit: aha - tytuł ; )

  • Rejestracja: dni
  • Ostatnio: dni
0

Spróbuj :

Kopiuj
public int myMethod(String day) throws SQLException{
  String sql = "Select count(*) as ilosc from MyTable WHERE someColumn = ? ";
  Connection connection = ConnFactory.get();
  PreparedStatement prepareStatement = null;
  ResultSet resultSet = null;
  int ret = -1;
  try{
      prepareStatement = connection.prepareStatement(sql);
      prepareStatement.setString(1, day);
      resultSet = prepareStatement.executeQuery(sql);
      if(resultSet.next()){
          ret = resultSet.getInt("ilosc");
      }
  }
  catch(SQLException sqle){
      // closing statement & ResultSet, log and throw exception
  }
  finally{
     // closing statement & ResultSet
  }
  ConnFactory.kill(connection);

  return ret;
}

Oraz podstaw na sztywno coś za zmienna day. Moze tu tkwi problem

Freakman
  • Rejestracja: dni
  • Ostatnio: dni
0

według mnie trzeba drążyć temat wstawiania przy pomocy setString gdy w bazie jest typ number - sam trafiłem na przypadek gdy wstawiając stringa z id i porównując go z typem liczbowym waliło mi errorem o typie kolumny. Ty błedów nie masz - nie wiem czy to zależy od wersji bazy czy czegoś innego.

  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Jaka wersja Javy? Jaka wersja sterownika OJDBC ? Która wersja Oracle ?
Kopiuj
      ...
      //prepareStatement.setString(1, day);
      prepareStatement.setInt(1, 20090311);   // czy zwraca poprawny wynik ?
      //prepareStatement.setInt(1, Integer.valueOf(day)); // albo to poprawny

Od strony Oracle włączyłbym trace'a i patrzył co trafia do parsera. Możliwe, że sterownik JDBC ma błąd.

  1. Zamiast prepared statement sprobowałbym czy działa zwykły statement.
Kopiuj
 Statement stmt = conn.createStatement();
 ResultSet rset = stmt.executeQuery("Select count(*) from MyTable WHERE someColumn =  20090311 ");
  1. I jeszcze wersja z PreparedStatement, ale z jawnym castowaniem:
Kopiuj
public int myMethod(String day) throws SQLException{
  String sql = "Select count(*) from MyTable WHERE someColumn = TO_NUMBER(?) ";
  Connection connection = ConnFactory.get();
  PreparedStatement prepareStatement = null;
  ResultSet resultSet = null;
  int ret = -1;
  try{
      prepareStatement = connection.prepareStatement(sql);
      prepareStatement.setString(1, day);
      resultSet = prepareStatement.executeQuery(sql);
      if(resultSet.next()){
          ret = resultSet.getInt(1);
      }
  }
  catch(SQLException sqle){
      // closing statement & ResultSet, log and throw exception
  }
  finally{
     // closing statement & ResultSet
  }
  ConnFactory.kill(connection);

  return ret;
}

pozdr,
yarel

  • Rejestracja: dni
  • Ostatnio: dni
0

I jeszcze jedno wydaje mi się dziwne:

Kopiuj
    resultSet = prepareStatement.executeQuery(sql);

Dlaczego dajesz jako parametr sql, a nie korzystasz z samego executeQuery() ?

pozdr,
yarel

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.