последовательность «testsequence» еще не определена в этом сеансе в postgresql Java

#java #postgresql #jdbi

#java #postgresql #jdbi

Вопрос:

Я использую Java-приложение с Google juice в качестве инжектора вместе с jdbi в качестве уровня базы данных.Мне нужно извлечь последовательность из базы данных, используя Java-код.

У меня есть таблицы в базе данных для приложения, последовательность которых не используется.Но для других целей мне нужно значение последовательности как текущее, следующее и последнее.

хотя следующие запросы работают в pg-admin

 select currval('testsequence'); 

select nextval('testsequence'); 

select last_value FROM testsequence;
  

код выглядит следующим образом.

 public long getCurrentSequenceFromDB()
{
    LOGGER.info("SequenceHelper :getCurrentSequenceFromDBSTART");
    try (Handle handle = jdbi.open())
    {
        SequenceDAO squenceDAO = handle.attach(SequenceDAO.class);
        long sequence = squenceDAO.getCurrentSequence();
        if (sequence != 0)
        {
            LOGGER.info("SequenceHelper :getCurrentSequenceFromDBEND");
            return sequence;
        }
        else
        {
            LOGGER.info("SequenceHelper :getCurrentSequenceFromDBsequence sequence is null");
            return 0;
        }

    }
    catch (Exception e)
    {
        LOGGER.error("Error in getting sequence from database", e);
        throw new SignageServiceException(ErrorCodes.UNEXPECTED_ERROR, "Error in getting sequence from database", e);
    }
}
  

и на уровне запроса как:

 @SqlQuery("select currval('public.testsequence')")
public long getCurrentSequence();
  

Я получаю ошибку как

 Caused by: org.postgresql.util.PSQLException: 
ERROR: currval of sequence "testsequence" is not yet defined in this session
  

Ответ №1:

В документе говорится

currval

Возвращает значение, самое последнее полученное nextval для этой последовательности в текущем сеансе. (Сообщается об ошибке, если nextval никогда не вызывался для этой последовательности в этом сеансе.) Поскольку это возвращает локальное значение сеанса, оно дает предсказуемый ответ, выполнялись ли другие сеансы nextval с момента выполнения текущего сеанса.

Поэтому вам нужно сначала вызвать nextval в рамках этого сеанса.

В противном случае, если вам нужно последнее значение для любого сеанса, вы можете использовать

 SELECT last_value FROM sequence_name;
  

Ответ №2:

Функция nextval PostgreSQL должна быть вызвана перед вызовом функции currval, иначе будет выдана ошибка. Функция PostgreSQL currval используется для доступа к текущему значению указанной последовательности. Обратите внимание, что currval может использоваться только в том случае, если на nextval ссылались в текущем сеансе пользователя хотя бы один раз.

теперь она отлично работает с последовательностью вызова базы данных как,

     @SqlQuery("select last_value from testsequence")
    public long getLastSequence();

    @SqlQuery("select nextval('testsequence')")
    public long getNextSequence();

    @SqlQuery("select currval('testsequence')")
    public long getCurrentSequence();