Я хочу вызвать функцию из 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?