我正在将Java应用程序与google juice作为注入器以及jdbi作为数据库层一起使用。我需要使用Java代码从数据库中获取序列。
我在数据库中有用于该应用程序的表,这些表未使用。但是出于其他目的,我需要将序列值作为current,next和last。
尽管以下查询在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
答案 0 :(得分:2)
doc说
当前
在当前会话中返回该序列的nextval最近获取的值。 (如果nextval具有 从未在此会话中为此顺序调用。)因为这是 返回会话本地值,它给出了可预测的答案 自当前会话以来其他会话是否已执行nextval 做到了。
因此,您需要在此会话中首先致电nextval
。
否则,如果您想要任何会话的最后一个值,则可以使用
SELECT last_value FROM sequence_name;
答案 1 :(得分:0)
在调用 currval 函数之前,必须先调用PostgreSQL nextval 函数,否则将引发错误。 PostgreSQL currval 函数用于访问指定序列的当前值。 请注意,只有在当前用户会话中至少引用一次 nextval 时,才能使用 currval 。
现在可以正常使用数据库调用序列了,
List<Properties> props = propDao.findPropertiesByHotelCode(hotel.getCode());
propDao.deleteInBatch(props);
propDao.flush();