2016-12-14 4 views
1

Java에서 DB2에 저장된 함수를 실행하려고합니다. 이를 호출하는 함수와 코드는 Spring 문서의 예제 인 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-3의 코드와 매우 유사합니다. 여기SimpleJdbcCall이 저장된 함수에 대해 작동하지 않습니다.

CREATE FUNCTION ST_CLIENT_SEGMENT(p_oib VARCHAR(11)) 
    RETURNS VARCHAR(10) 
    NO EXTERNAL ACTION 

를 코드입니다 : 다음은 함수 선언이다 이런 일이 발생하는 이유

//version1 
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate) 
    .withSchemaName("VLIB"). 
    .withFunctionName("ST_CLIENT_SEGMENT") 
SqlParameterSource in = new MapSqlParameterSource().addValue("p_oib", "123"); 
return simpleJdbcCall.executeFunction(String.class, in); 

//version2 
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate) 
    .withSchemaName("VLIB") 
    .withFunctionName("ST_CLIENT_SEGMENT"); 
simpleJdbcCall.declareParameters(new SqlParameter("p_oib", Types.VARCHAR)); 
return simpleJdbcCall.executeFunction(String.class, "123"); 

//the same exception 
//Caused by: java.sql.SQLException: [SQL0440] Routine ST_CLIENT_SEGMENT in VLIB not found with specified parameters. 

사람이 알고 있나요? SQL 클라이언트에서 함수를 호출하면 모든 것이 잘 동작합니다.

+1

잘 작동하기 때문에 그들은 단지 것 저장 프로 시저가 될 수 있습니다), select 쿼리에서와 같이 함수를 사용하려고 할 수 있습니다. –

+0

@MarkRotteveel 내가 말했듯이, 그것은 내 SQL 클라이언트 (동일한 사용자)에서 작동합니다. "값 vlib.st_client_segment ('123');" 또는 "SYSIBM.SYSDUMMY1에서 VLIB.ST_CLIENT_SEGMENT ('123')을 선택하십시오." – Ivan

+0

SimpleJdbcCall에 의해 생성 된 것과 동일하다고 가정하고 있습니다. 코드를 보면 실제로 JDBC 이스케이프를 생성하고 있습니다 :'{? = vlib.st_client_segment (?)} '를 호출하십시오. 그러면 JDBC 드라이버에 의해 변환되어야합니다. DB2 JDBC 드라이버는 JDBC 호출 이탈로 저장 프로시 듀어 실행 만 지원하므로 함수 호출에 유효하지 않은 SQL을 생성 할 수 있습니다. –

답변

2

동료가 해결책을 찾았습니다. 이것이 DB2 문제점 http://www.itjungle.com/fhg/fhg102506-story01.html 인 것 같습니다. 나는 또한이 변화 모든 후 나에게 예외

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT(?)", new Object[] {oib}, String.class); 
//Caused by: java.sql.SQLException: [SQL0418] Use of parameter marker not valid. 

을 준 또 다른 SQL을 시도하는 데이터베이스의 많은 기능이 (단독으로 호출 할 수 없습니다

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT(CAST(? as CHAR))", new Object[] {oib}, String.class);