如何将Sequence当前值更改为之前的值?

时间:2015-06-26 06:39:07

标签: java sql jdbc

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

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

如果有可能,请举个例子。

我测试了它,但是我收到了错误:

  

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

$Gateway -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.(?<content>)"
$fourth = $matches['content']
$mgmt = "172.18.47.19"
$mgmt -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.(?<content>.*)"
$new = $matches['content']
$mgmt.replace($new,$fourth)

这是我的代码:

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:776)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502)

2 个答案:

答案 0 :(得分:3)

我会试着告诉不要怎么做,但为什么你不应该这样做。

你想要达到的目标会破坏序列的目的。序列是为了给你一个唯一的标识符,如果你跳过一些值无关紧要。有一天或者另一天,试图回滚到一个旧的价值,特别是你有并发交易的地方(你今天可能没有,但你可能会在某个时间或无意中打几次电话)会引发严重的问题。

所以我建议不要这样做。

请注意,更改序列号以手动解决问题并将其作为流程的一部分进行操作是不同的,我想说的是不要将其作为代码流的一部分。

仍然,搜索引导我这个答案。建议阅读。 https://stackoverflow.com/a/93633/2482288

答案 1 :(得分:1)

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

SELECT test.CURRVAL
FROM dual; -->illegal

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

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