Хранимая процедура Spring - результаты, возвращающиеся из процедуры, всегда пусты - PullRequest
15 голосов
/ 28 января 2010

Я использую классы 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 ....

, где

* +1007 *

Я создал следующий класс хранимых процедур для получения информации из процедуры оракула

    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 с хранимой процедурой Spring? Что еще я могу использовать? Я также попробовал SqlReturnResultSet, и это тоже не сработало.

Ответы [ 2 ]

7 голосов
/ 28 января 2010

Проблема здесь в том, что Oracle выполняет хранимые процедуры не в соответствии с JDBC. SP Oracle возвращают данные набора результатов через параметры OUT или возвращаемые значения, которые являются курсорами, и они должны обрабатываться специально. Это означает, что вы не можете использовать какой-либо материал Spring JDBC, который предполагает соответствие JDBC, вы должны сделать это самостоятельно.

На практике это означает, что вы должны использовать JdbcTemplate и CallableStatementCallback, что означает гораздо больше ручного кодирования JDBC, чем вам в идеале, но я пока не нашел способа избежать этого.

С некоторой стороны, я скорее подозреваю, что спецификация JDBC была написана так, чтобы точно соответствовать Sybase (и, по ассоциации, с SQL Server), потому что способ обработки хранимых процедур в JDBC замечательный подходит для этих систем (и плохо подходит для Oracle).

4 голосов
/ 23 марта 2012

Проблема проста, если вы не передаете RowMapper при объявлении outparam, который является КУРСОРОМ. Весна вернет {} т. Е. Пустой курсор.

 declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR)); - returns empty {}
 declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR, new ApplicationMapper()); - returns result

Где ApplicationMapper - мой пользовательский картограф, который реализует RowMapper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...