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 클라이언트에서 함수를 호출하면 모든 것이 잘 동작합니다.
잘 작동하기 때문에 그들은 단지 것 저장 프로 시저가 될 수 있습니다), select 쿼리에서와 같이 함수를 사용하려고 할 수 있습니다. –
@MarkRotteveel 내가 말했듯이, 그것은 내 SQL 클라이언트 (동일한 사용자)에서 작동합니다. "값 vlib.st_client_segment ('123');" 또는 "SYSIBM.SYSDUMMY1에서 VLIB.ST_CLIENT_SEGMENT ('123')을 선택하십시오." – Ivan
SimpleJdbcCall에 의해 생성 된 것과 동일하다고 가정하고 있습니다. 코드를 보면 실제로 JDBC 이스케이프를 생성하고 있습니다 :'{? = vlib.st_client_segment (?)} '를 호출하십시오. 그러면 JDBC 드라이버에 의해 변환되어야합니다. DB2 JDBC 드라이버는 JDBC 호출 이탈로 저장 프로시 듀어 실행 만 지원하므로 함수 호출에 유효하지 않은 SQL을 생성 할 수 있습니다. –