Вызов процедуры, которая возвращает курсор с пружиной - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу вызвать функцию из Postgres, которая возвращает курсор, поскольку Postgres меняет имя курсора, поэтому решение состояло в том, чтобы предоставить имя курсора в качестве аргумента функции, а затем получить этот курсор из результатов, возвращаемых при вызове ниже, - это код i.Я использую для вызова функции

 DefaultTransactionDefinition def = new DefaultTransactionDefinition();

    TransactionStatus status = dsTransactionManager.getTransaction(def);

    try
    {
        List<Users> lst = new ArrayList<>();    

        SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate.getDataSource());

        String cName = UUID.randomUUID().toString() + "_cur";

        simpleJdbcCall.setFunction(true);
        simpleJdbcCall.withFunctionName("get_org_users");
        simpleJdbcCall.returningResultSet(cName, BeanPropertyRowMapper.newInstance(Users.class));

        simpleJdbcCall.declareParameters(
                new SqlParameter("orgid", Types.BIGINT),
                new SqlParameter("user_cn", Types.OTHER),
                new SqlOutParameter(cName, Types.REF_CURSOR)
                );

        Map<String, Object> params = new HashMap<String, Object>(); 
        params.put("orgid", orgID);
        params.put("user_cn", cName);
        Map<String, Object> result =
                simpleJdbcCall.execute(params); 
        dsTransactionManager.commit(status);                    

        lst = (List<Users>) result.get(cName);

        return lst;
    }
    catch (Exception e) {
        dsTransactionManager.rollback(status);
        throw e;
    }
    finally
    {           
    }

То, что я хотел спросить, возможно ли получить курсор без указания имени курсора, например, я просто jdbc, мы можем сделать это

    connection = jdbcTemplate.getDataSource().getConnection();
    connection.setAutoCommit(false);
    ..................... 
    CallableStatement proc=connection.prepareCall(query,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    ..............
    proc.execute();
    rs  = (ResultSet) proc.getObject(1);

Вы можете видеть сверху код, я выполнил функцию и получить курсор без указания имени курсора, так что можно сделать то же самое с postgres?

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