Как получить курсор из Java, используя библиотеку реактивов для PostgreSQL? - PullRequest
0 голосов
/ 14 июня 2019

В настоящее время я создаю 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();
       }
     });
    }

Надеюсь, вы поможете мне, ребята, я все еще буду искать решение самостоятельно.

Заранее спасибо! :)

...