在PostgreSQL的这个会话中尚未定义序列“ testsequence”

时间:2019-04-04 10:40:24

标签: java postgresql jdbi

我正在将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

2 个答案:

答案 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();