2015-10-10 15 views
8

jestem coraz to PSQLException:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1" 
    Position: 37 

Kiedy uruchomić następujący kod:

ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;"); 
ps.setString(1, "30 minutes"); 
System.out.println(ps); 
rs = ps.executeQuery(); 

jednak funkcja println wyświetla to w konsoli:

SELECT current_timestamp + INTERVAL '30 minutes' 

Ktoś wie, co jest nie tak? Zapytanie w konsoli działa poprawnie w pgAdmin, więc wiem, że nie jest to błąd składniowy.

+0

Nie ma znaczenia, średnik jest całkowicie poprawny –

+0

zapytanie działa dla mnie, czy jest to rzeczywisty kod czy masz jakąś zmienną w miejsce "30 minut" – silentprogrammer

+0

To jest rzeczywisty kod ... Czy biegniesz? postgres? –

Odpowiedz

14

Chociaż składnia INTERVAL '30 minutes' jest ważna, gdy piszesz SQL bezpośrednio w konsoli, to jest faktycznie uważana za przedział dosłowne i nie zadziała, gdzie łańcuch, który następuje słowo INTERVAL nie jest ciągiem znaków.

Gotowe instrukcje w PostgreSQL są implementowane po stronie serwera przy użyciu PREPARE, a każdy ? jest postrzegany jako faktyczna zmienna na serwerze. Właśnie dlatego narzeka na to, że $1 nigdy nie napisałeś w swoim zestawieniu jako $.

Dlatego składnia literalna nie działa dla przygotowanej instrukcji.

Nie pozwól, aby reprezentacja napisów (wynik println) przygotowanego komunikatu wprowadziła Cię w błąd - nie jest to tym, co widzi serwer. Serwer widzi tam zmienną.

W ten sposób należy użyć składni, która pobiera ciąg (który może być zmienną lub literałem) i konwertuje go na przedział. Na przykład ?::INTERVAL lub CAST(? AS INTERVAL).

Jest to zatem błąd , a nie.

+0

Dziękuję bardzo! 'ps = connection.prepareStatement (" SELECT current_timestamp +? :: INTERVAL; ");' Działa to zgodnie z oczekiwaniami, szkoda, że ​​nie jest to udokumentowane w książce JSP, którą kupiłem :) –

+0

Cóż, to książka JSP nie przypuszczam, że jest to PostgreSQL.Każdy DBMS ma swoje własne dziwactwa, a niektóre są związane ze szczególnym sposobem, w jaki zdecyduje się na wdrożenie umowy JDBC. – RealSkeptic

+0

Bardzo dobry punkt ... kiedy coś nie działa tak, jak się spodziewam, zawsze szybko wskaż palcem haha –

-1

Wierzę, że to jest błąd, Postgres i tak myślałem o brudnym hack, aby obejść ten problem ...

ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;"); 
ps.setString(1, "30 minutes"); 
ps = connection.prepareStatement(ps.toString()); 
rs = ps.executeQuery(); 

Zastanawiam się, czy to będzie kiedykolwiek dostać stałe?

Powiązane problemy