В настоящее время я создаю API для выполнения хранимых процедур (функций) в моем PostgresqlDB
и извлечения данных с помощью refcursor
.
Я знаю, что для извлечения данных из курсора я должен отключить autocommit
в соединении, но я не могу найти, как использовать micronaut
framework с reactiverse postgresql
библиотекой.
Я также знаю, что другой способ сделать это - создать транзакцию с оператором BEGIN
, поэтому я пошел по этому пути, потому что думал, что это будет проще. Но сейчас у меня проблемы.
Я много искал и нашел примеры выполнения функций, но любая из них извлекается из refcursor
, поэтому они не работают для меня.
Моя версия Postgresql - 9.1 , поэтому я попытался создать транзакцию непосредственно из моего пула соединений и выполнить внутри ее обработчика два preparedQuerys
.
Вот код.
PgPool pool = dbConnectionManager.getClient();
pool.begin(ar1 -> { // Begin transaction
if (ar1.succeeded()) {
PgTransaction tx = ar1.result();
// Execute Function, this return my refCursor name String so I can fetch the data from it.
tx.preparedQuery("SELECT get_statistics_input_solved_by_date($1,$2,$3,$4);", Tuple.of(refCursor, Date.valueOf(startDate), Date.valueOf(endDate), ticketType), ar2 -> {
if(ar2.succeeded()) {
PgRowSet pg = ar2.result();
// Execute Fetch statement, here I'm having 2 problems.
// 1- If I call this method as above (using a Tuple for parameters) I'll get an error from Vertx class "Cannot coarse [ref] to []" so I proceded with option 2.
// 2- Calling method preparedQuery without Tuple parameters, this one doesn't produce an error but I'm getting my cursor without data, I can also see column names while debugging.
tx.preparedQuery("FETCH ALL IN \""+refCursor+"\";", ar3 -> {
System.out.println("ENTRO AR3");
if(ar3.succeeded()) {
PgRowSet pg2 = ar3.result();
System.out.println("Has next?\n" + pg2.iterator().hasNext();
tx.commit(ar -> {
if (ar.succeeded()) {
System.out.println("OK");
} else {
System.out.println("NOT OK\n" + ar.cause());
}
});
} else {
tx.rollback();
}
});
} else {
tx.rollback();
}
});
}
Надеюсь, вы поможете мне, ребята, я все еще буду искать решение самостоятельно.
Заранее спасибо! :)