2011-09-01 3 views
2

Java에서 PostgreSQL 함수를 호출하면 왜 함수가 존재하지 않는다는 오류가 표시됩니까?

CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$ 
BEGIN 
INSERT INTO pageRelevance VALUES (id,value); 
EXCEPTION WHEN unique_violation THEN 
    UPDATE pageRelevance SET relevance = value WHERE pageId = id;  
END 
$$ 
LANGUAGE plpgsql; 

그리고이 함수를 호출 코드 :

try (CallableStatement cstm = conn.prepareCall(PAGE_RELEVANCE_SQL)) { 
     for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) { 
      cstm.setInt(1, entry.getKey()); 
      cstm.setDouble(2, entry.getValue()); 
      cstm.addBatch(); 
     } 
     cstm.executeBatch(); 
    } catch (SQLException e) { 
     LOGGER.error("Error discovering pages relevance: " + e.getNextException()); 
    } 
} 

이 작동하지 않는, 내가 function replacepagerelevance(integer, double precision) doesn't exists. 것을 알리는 오류를 받고 있어요을

나는 데이터베이스에이 절차를 가지고있다. 왜? SELECT replacePageRelevance('882','8.0') :

생성 된 호출이 있습니다. 내가 pgAdmin에서 이것을 실행하면, 그것은 자바에서 작동하지만,하지.

답변

4

당신의 PL/pgSQL의 기능은 다음과 같이 정의되어 있기 때문입니다 :

replacePageRelevance(id INT, value REAL) 

REAL 부동 소수점 단 정밀도이지만, 자바에 당신은 배정 밀도로 사용하려는 어떠한 암시 적 캐스팅이 없다 그런 상황.

당신은 오히려 그러나 그것은 자바 API를 읽고 becuase, 명확 공동 아니에요, 단 정밀도 REAL 데이터 유형에 대한 CallableStatement.setFloat을 사용해야합니다

가 지정된 Java의 float 치로 지정된 파라미터를 설정합니다. 드라이버는 데이터베이스로 보낼 때이 값을 SQL FLOAT 값으로 변환합니다. FLOAT 이후

는 오류 메시지를 생성 CallableStatement.setDouble 같은 효과 (즉, 이상 하네)와 함께 실행 포스트 그레스에 DOUBLE PRECISION에 대한 동의어입니다.

물론 기능을 replacePageRelevance(id INT, value DOUBLE PRECISION)으로 변경할 수 있으며 코드와 잘 일치하는지 확인했습니다. 당신은) 함수에 REAL을 유지하려면

그럼에도 불구하고, 다음과 같이 명시 적 캐스트를 사용

String PAGE_RELEVANCE_SQL = "{call replacePageRelevance(?, ?::real)}"; 
+0

무엇 PostgreSQL의 유형은 배정 밀도와 호환? –

+0

@ Renato : 그냥 ['double precision'] (http://www.postgresql.org/docs/current/static/datatype-numeric.html) –

+0

해답과 설명에 감사드립니다. 정밀도가별로 필요 없어 변환을 사용하고 있습니다. –

관련 문제