#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();