Oracle JDBC where i nieprawidłowy wynik zapytania

0

Kod:

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?

0

a jakie przykladowe wartosci ma day?

0

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

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 ; ))

0

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

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 ) ?
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.

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.

0

a jaka to baza? Oracle?

//edit: aha - tytuł ; )

0

Spróbuj :

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

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.

0
  1. Jaka wersja Javy? Jaka wersja sterownika OJDBC ? Która wersja Oracle ?
      ...
      //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.
 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:
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

0

I jeszcze jedno wydaje mi się dziwne:

    resultSet = prepareStatement.executeQuery(sql);

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

pozdr,
yarel

1 użytkowników online, w tym zalogowanych: 0, gości: 1