스프링 저장 프로시저 - 프로시저에서 반환되는 결과는 항상 비어 있습니다.
저는 Spring의 JdbcTemplate와 StoredProcedure 수업을 이용하고 있습니다.저장 프로시저 수업을 진행하는 데 어려움이 있습니다.
오라클 데이터베이스에 저장 프로시저가 있습니다.그것의 특징은
CREATE OR REPLACE PROCEDURE PRC_GET_USERS_BY_SECTION
(user_cursor OUT Pkg_Types.cursor_type
, section_option_in IN Varchar2
, section_in IN Varchar2) AS ....
어디에
TYPE cursor_type IS REF CURSOR;
Oracle 프로시저에서 정보를 얻기 위해 다음 저장 프로시저 클래스를 만들었습니다.
private class MyStoredProcedure extends StoredProcedure
{
public MyStoredProcedure(JdbcTemplate argJdbcTemplate)
{
super(argJdbcTemplate, "PRC_GET_USERS_BY_SECTION");
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR));
declareParameter(new SqlParameter("input1", Types.VARCHAR));
declareParameter(new SqlParameter("input2", Types.VARCHAR));
compile();
}
public Map<String, Object> execute() {
Map<String, Object> inParams = new HashMap<String, Object>();
inParams.put("input1", "BG");
inParams.put("input2", "FE");
Map output = execute(inParams);
return output;
}
}
저는 DAO 수업 중 하나의 방법으로 이것을 부르고 있습니다.
public List<String> getUserListFromProcedure() throws BatchManagerException
{
MyStoredProcedure sp = new MyStoredProcedure( this.jdbcTemplate );
Map<String, Object> result = new HashMap<String, Object>();
try
{
result = sp.execute();
}
catch( DataAccessException dae)
{
}
System.out.println(result.size());
return null;
}
그러나 맵의 크기는 항상 0이므로 아무것도 반환되지 않습니다.데이터베이스에 입력 기준과 일치하는 행이 있다는 것을 알고 있습니다.또한 코드 작업도 했습니다.java.sql.CallableStatement
오라클 저장 프로시저와 상호 작용하므로 프로시저가 양호합니다.섞는 것이 잘못된 것입니까?OraceleTypes.CURSOR
스프링의 저장 프로시저로?또 뭐 쓸 게 있나요?저도 노력했습니다.SqlReturnResultSet
그리고 그것도 효과가 없었습니다.
문제는 Oracle의 저장 프로시저 방식이 JDBC를 준수하지 않는다는 것입니다.Oracle의 SP는 OUT 파라미터 또는 커서인 반환 값을 통해 결과 집합 데이터를 반환하므로 특별히 처리해야 합니다.즉, JDBC를 준수한다고 가정하는 Spring의 JDBC 자료는 사용할 수 없습니다. 직접 사용해야 합니다.
실제로, 이것은 당신이 사용해야 한다는 것을 의미합니다.JdbcTemplate
그리고.CallableStatementCallback
그 말은 JDBC 코딩이 당신이 이상적으로 원하는 것보다 훨씬 더 수동적이라는 것을 의미하지만, 저는 아직 이것을 피할 방법을 찾지 못했습니다.
약간의 측면에서, 저는 JDBC 사양이 Sybase(및 관련하여 SQL Server) 작업 방식과 밀접하게 일치하도록 작성되었다고 생각합니다. JDBC에서 저장된 프로시저를 처리하는 방식은 이러한 시스템에 매우 적합하고 Oracle에는 적합하지 않기 때문입니다.
커서인 outparam을 선언하는 동안 RowMapper를 전달하지 않으면 문제가 간단합니다. 봄이 다시 돌아올 것입니다.{}
즉, 커서를 비웁니다.
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR)); - returns empty {}
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR, new ApplicationMapper()); - returns result
여기서 ApplicationMapper는 RowMapper를 구현하는 사용자 지정 매퍼입니다.
언급URL : https://stackoverflow.com/questions/2154386/springs-stored-procedure-results-coming-back-from-procedure-always-empty
'programing' 카테고리의 다른 글
루비의 블록 및 수율 (0) | 2023.07.21 |
---|---|
오라클에 따옴표를 포함하는 문자열 삽입 (0) | 2023.07.21 |
통계: Python의 조합 (0) | 2023.07.21 |
ExecutorService 'applicationTaskExecuter' 종료 중 (0) | 2023.07.21 |
봄 부팅 웹 소켓에서 특정 사용자에게 알림 보내기 (0) | 2023.07.21 |