Mam zapytanie, które maOracle10 i JDBC: jak sprawić, aby CHAR ignorował spacje końcowe w porównaniu?
... gdzie PRT_STATUS = 'ONT' ...
Pole prt_status jest zdefiniowany jako CHAR (5), choć. Więc zawsze jest wypełniony spacjami. Zapytanie nic nie pasuje do wyniku. Do tej pracy zapytania muszę zrobić
... gdzie RTRIM (PRT_STATUS) = 'ONT'
który działa.
To denerwujące.
W tym samym czasie, kilka czystych java DBMS klientów (Oracle SQLDeveloper i AquaStudio) NIE mam problemu z pierwszym zapytaniem, zwracają poprawny wynik. TOAD również nie ma problemu.
Podejrzewam, że po prostu łączą w pewnym trybie zgodności (na przykład ANSI), więc Oracle wie, że CHAR (5) ma być porównywany bez żadnego szacunku do znaków końcowych.
Jak mogę to zrobić z obiektami połączeń, które otrzymuję w mojej aplikacji?
AKTUALIZACJA Nie można zmienić schematu bazy danych.
ROZWIĄZANIE To rzeczywiście sposób, w jaki Oracle porównuje pola z przekazanymi parametrami.
Po zakończeniu wiązania łańcuch jest przekazywany za pomocą metody PreparedStatement.setString(), która ustawia typ na VARCHAR, a tym samym Oracle używa porównania bez uzupełniania - i kończy się niepowodzeniem.
Próbowałem użyć setObject (n, str, Types.CHAR). Fails. Dekompilacja pokazuje, że Oracle ignoruje CHAR i przekazuje ją ponownie jako VARCHAR.
Wariant że wreszcie działa jest
setObject(n,str,OracleTypes.FIXED_CHAR);
To sprawia, że kod nie przenośny chociaż.
Klientom UI udaje się z innego powodu - używają literałów znaków, które nie są wiążące. Kiedy wpisuję PRT_STATUS = "ONT", "ONT" jest literałem, a jako takie porównywane przy użyciu wyściełanej drogi.
W porządku. Zobacz moją zaktualizowaną odpowiedź. – vladr
Hmm ... to ma sens. Zbiór setString JDBC używa VARCHAR do wiązania parametru ciągu. Nie jestem pewien, czy mogę go użyć, aby rozwiązać problem, ale przynajmniej staje się teraz jaśniejszy. –
Masz prawdopodobnie rację: "Oracle używa nonpadded semantyki porównania, gdy jedna lub obie wartości w porównaniu mają typ danych VARCHAR2 lub NVARCHAR2". Muszę zrobić test, żeby to sprawdzić. –