2017-02-06 5 views
2

스키마 위치에서 위치 정보를 가져 오려고합니다. Postgres 버전은 9.3.15이고 사용되는 maven jar는 9.4-1200-jdbc4 우분투 14.04 LTS입니다. 연결 풀링에 대해서는 mchange 버전 0.9.5.2을 사용하고 있습니다.Postgres를 사용하여 ID를 가져올 수 없습니다. 저장 함수 - 형식 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) 

위치 스키마. 생성 LocationId와 위치를 가져하려고 할 때 위치의

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' 
); 

삽입이 잘 작동하지만, 그것은 저장 기능을 사용하여 실패. 저장 프로 시저는 - 내가 여기서 뭔가를 놓치고 경우 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; 

이, 알려 주시기 바랍니다 ID로 위치를 얻기. ID로 위치를 가져 오는 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;