Witam.
Od razu napiszę, że nie jestem pewien czy problem dotyczy bardziej Javy, czy Baz Danych.
Próbuję napisać kod w Javie, który pobiera dane z bazy danych. Dane muszą być posortowane, a kolumna, która jest kryterium sortowania musi być podawana dynamicznie.
public static boolean wczytajDaneKontrahentow(int liczbaRekordow, String sortowanie){
Connection polaczenie = null;
PreparedStatement polecenie = null;
try {
//Nawiązanie połączenia z bazą danych.
Class.forName("oracle.jdbc.driver.OracleDriver");
polaczenie = DriverManager.getConnection("jdbc:oracle:thin:@1.1.7.12:1521:orcl","aaa","bbb");
String zapytanie = "select * from kontrahenci k order by ?";
polecenie = polaczenie.prepareStatement(zapytanie);
//Linia powodująca problemy:
polecenie.setString(1, sortowanie);
ResultSet wynik = polecenie.executeQuery();
//Tutaj wykorzystuję pobrane dane. Nie jest to istotne w omawianym problemie.
while(wynik.next()){
ListyKontrahent.getListaKontrahentow().add(new Kontrahent(wynik));
}
} catch (ClassNotFoundException e) {
System.out.println("Nie znaleziono sterownika lub znaleziono, ale niewłaściwy");
return false;
} catch (SQLException e) {
System.out.println("Nie nawiązano połączenia z tabelą Kontrahenci lub błąd SQL");
return false;
} finally {
try {
if(polaczenie != null)
polaczenie.close();
} catch (SQLException e) {}
try {
if(polecenie != null)
polecenie.close();
} catch (SQLException e) {}
}
return true;
}
Problem polega na tym, że metoda setString(1, sortowanie) nie działa jak należy. Metoda powinna wpisywać wartość zmiennej sortowanie w miejsce ? zapytania SQL, co spowodowałoby posortowanie danych, a tak się nie dzieje -- dane są pobierane, ale nie posortowane . Jak w miejsce ? na sztywno podam nazwę kolumny, to polecenie działa poprawnie, ale jak podam ją przez parametr (jak w przykładzie) lub wpiszę jej nazwę do setString(), to już nie. Jak w innym zapytaniu w podobnej sytuacji używam setInt(), to wszystko jest dobrze.
We wszystkich przykładach jakie znalazłem podobne programy napisane są tak jak mój.
Aby połączyć się z bazą danych wykorzystuję sterowniki ojdbc5.jar pobrane stąd:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Ojdbc6.jar i ojdbc7.jar nie działają. Testowałem obydwa dość dawno temu, więc nie jestem pewien dlaczego, ale chyba gdzieś wyczytałem, że miało to coś wspólnego z tym, że baza na której pracuję jest dość stara i gryzą się nazwy stref czasowych (kod rzucał wyjątek: SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found). Wiem, że sterowniki powinny być kompatybilne ze starszymi wersjami, ale z jakiegoś powodu nie są. Przed napisaniem tego tematu ponownie to sprawdziłem.
Czy ktoś wie w czym tkwi problem i jak można go naprawić?