Java i baza danych Oracle. Niedziałająca metoda setString() przy tworzeniu zapytania ze zmienną

0

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ć?

1

http://stackoverflow.com/questions/12430208/using-a-prepared-statement-and-variable-bind-order-by-in-java-with-jdbc-driver

Musisz dokleić kolumnę sortującą do zapytania. Wcześniej sprawdź, czy nie zawiera jakichś niestandardowych znaków, aby uniknąć sql injection.

0

Działa jak należy. Dzięki.

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