Java 如何将序列当前值更改为以前的值?

Java 如何将序列当前值更改为以前的值?,java,sql,jdbc,Java,Sql,Jdbc,在我的项目中,我有一个事务功能。如果该事务失败,则所有数据将恢复到上一阶段 考虑一下,在该事务中,我使用序列的下一个值向表中插入值。如果事务失败,那么我想重置或将序列更改为上一个值 如果可能的话,给我举个例子 我测试了它,但我得到了错误: java.sql.SQLException:ORA-08002:sequence TEST.CURRVAL尚未在此会话中定义 这是我的密码: String sql1 = "select test.currval from dual";

在我的项目中,我有一个事务功能。如果该事务失败,则所有数据将恢复到上一阶段

考虑一下,在该事务中,我使用序列的下一个值向表中插入值。如果事务失败,那么我想重置或将序列更改为上一个值

如果可能的话,给我举个例子

我测试了它,但我得到了错误:

java.sql.SQLException:ORA-08002:sequence TEST.CURRVAL尚未在此会话中定义

这是我的密码:

        String sql1 = "select test.currval from dual";
        pst = conn.prepareStatement(sql1);
        rs = pst.executeQuery();
        int currentValue = 0;
        if(rs.next()){
            currentValue = rs.getInt(1);
        }
        currentValue -= 1;
        String sql2 = "alter sequence Test start with '"+currentValue+"'";
        pst = conn.prepareStatement(sql2);
        pst.execute();
        pst = conn.prepareStatement(sql1);
        rs = pst.executeQuery();
        if(rs.next()){
            JOptionPane.showMessageDialog(null, rs.getInt(1),"Current Sequence Number",JOptionPane.INFORMATION_MESSAGE); ;
        }

ORA-08002
表示在调用序列下一个值之前,您已尝试获取序列当前值。这在甲骨文中是非法的

SELECT test.CURRVAL
FROM dual; -->illegal

SELECT test.NEXTVAL
FROM dual;
SELECT test.CURRVAL
FROM dual; -->legal

请阅读此内容以更好地理解。

ORA-08002表示您在调用序列下一个值之前已尝试获取序列当前值。这在甲骨文中是非法的

SELECT test.CURRVAL
FROM dual; -->illegal

SELECT test.NEXTVAL
FROM dual;
SELECT test.CURRVAL
FROM dual; -->legal

请阅读此文以便更好地理解。

我将尽量不告诉您如何做,而是告诉您为什么不应该做

你试图达到的目的与顺序背道而驰。序列是用来给你们一个唯一的标识符的,若你们跳过了一些值并没有关系。总有一天,试图回滚到旧值,特别是在您有并发事务的情况下(您今天可能没有,但您可能会在某个时候故意或无意地多次调用),这将导致严重的问题 所以我建议不要这样做

请注意,更改序列号以手动解决问题并将其作为流程的一部分是不同的,我想说的是不要将其作为代码流程的一部分。
尽管如此,一次搜索还是给了我这个答案。推荐阅读

我不会告诉你怎么做,而是告诉你为什么不该做

你试图达到的目的与顺序背道而驰。序列是用来给你们一个唯一的标识符的,若你们跳过了一些值并没有关系。总有一天,试图回滚到旧值,特别是在您有并发事务的情况下(您今天可能没有,但您可能会在某个时候故意或无意地多次调用),这将导致严重的问题 所以我建议不要这样做

请注意,更改序列号以手动解决问题并将其作为流程的一部分是不同的,我想说的是不要将其作为代码流程的一部分。
尽管如此,一次搜索还是给了我这个答案。推荐阅读

谢谢你的建议,对我很有帮助。谢谢你的建议,对我很有帮助。