2017-02-06 14 views
2

Я пытаюсь получить информацию о местоположении из схемы Location. Postgres версия 9.3.15 и maven jar используется 9.4-1200-jdbc4 ubuntu 14.04 LTS. Для пула соединений я использую mchange версии 0.9.5.2.Невозможно получить идентификатор с помощью Postgres Сохраненная функция - Плохое значение для типа int

org.postgresql.util.PSQLException: Bad value for type int : -,24.7477464699999992,32.7477464700000027,232328,xxxx,xxxxx,xxxx,"xxxx",India,landmark 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.toInt(AbstractJdbc2ResultSet.java:2962) 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:2145) 
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getInt(NewProxyResultSet.java:425) 
    at com.creo.hike.direct.storage.jdbc.service.LocationService.getLocation(LocationService.java:74) 
    at com.creo.hike.direct.storage.jdbc.service.LocationService.getLocation(LocationService.java:66) 
    at com.creo.hike.direct.testapp.App.testLocationService(App.java:38) 
    at com.creo.hike.direct.testapp.App.main(App.java:19) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Схема расположения.

CREATE TABLE Location (
    LocationId SERIAL PRIMARY KEY, 
    Latitude DOUBLE PRECISION NOT NULL DEFAULT 0.0, 
    Longitude DOUBLE PRECISION NOT NULL DEFAULT 0.0, 
    Pincode  INTEGER NOT NULL DEFAULT 0, 
    InnerAddress TEXT NOT NULL DEFAULT 'Unknown', 
    Locality  TEXT NOT NULL DEFAULT 'Unknown', 
    City   TEXT NOT NULL DEFAULT 'Unknown', 
    State  TEXT NOT NULL DEFAULT 'Unknown', 
    Country  TEXT NOT NULL DEFAULT 'Unknown', 
    Landmark  TEXT NOT NULL DEFAULT 'Unknown' 
); 

Вводов Места работают хорошо, но при попытке извлечь Место сгенерированных LocationId, он не удался, используя хранимую функцию. Хранимая процедура - Получение местоположения по идентификатору gets_location_by_id

CREATE OR REPLACE FUNCTION gets_location_by_id(
    localId INTEGER 
) RETURNS Location AS $$ 
    DECLARE 
    row Location%ROWTYPE; 
    BEGIN 
    SELECT * INTO row 
    FROM Location 
     WHERE LocationId = localId; 
    RETURN row; 
    END; 
    $$ LANGUAGE plpgsql; 

Пожалуйста, дайте мне знать, если я пропускаю что-то здесь. Java-код, чтобы получить местоположение по идентификатору является

String sql = "SELECT gets_location_by_id(?)"; 
PreparedStatement statement = connection.prepareStatement(sql); 
statement.setInt(1, locationId); 
ResultSet resultSet = statement.executeQuery(); 
location = new Location(
       resultSet.getInt(1), 
       resultSet.getDouble(2), 
       resultSet.getDouble(3), 
       resultSet.getInt(4), 
       resultSet.getString(5), 
       resultSet.getString(6), 
       resultSet.getString(7), 
       resultSet.getString(8), 
       resultSet.getString(9), 
       resultSet.getString(10)); 
+0

Вы уверены, что SELECT * возвращает LocationId , Широта, Долгота, Pincode, ... в строку в этом точном порядке? –

+0

Да. Он возвращался. – Vish

ответ

3

Вы возвращаете строку из таблицы, которая имеет типа данных, который специально сделан для каждого отношения. Поэтому вместо того, чтобы получать 10 значений, вы получаете 1 составное значение. Вы можете решить эту проблему довольно легко с помощью функции в качестве источника строк в запросе:

String sql = "SELECT * FROM gets_location_by_id(?)"; 

Вы могли бы также упростить вашу функцию следующим образом:

CREATE FUNCTION gets_location_by_id(localId INTEGER) RETURNS SETOF Location AS $$ 
BEGIN 
    RETURN QUERY SELECT * FROM Location WHERE LocationId = localId; 
END; 
$$ LANGUAGE plpgsql; 

 Смежные вопросы

  • Нет связанных вопросов^_^