在PostgreSQL Java中,序列"testsequence"在此会话中尚未定义。

3

我正在使用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
2个回答

5

这份文档指出:

currval

返回当前会话中此序列最近生成的nextval值。(如果当前会话中从未调用过此序列的nextval,则报错。)因为这是返回一个会话本地值,所以它能够给出一个可预测的答案,无论其他会话是否在当前会话执行nextval。

因此,在此会话中首先需要调用nextval

否则,如果您想要任何会话的最后一个值,可以使用

SELECT last_value FROM sequence_name;

3
PostgreSQL中必须先调用“nextval”函数,然后再调用“currval”函数,否则将会报错。 “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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接