【问题标题】:use of ROLLBACK command in OracleOracle中ROLLBACK命令的使用
【发布时间】:2013-05-13 23:47:27
【问题描述】:

我创建了表格

SQL>CREATE TABLE Student
(
StudID         NUMBER(6),
StudName       VARCHAR2(25),
JoinDate       DATE
);   
Table created.

SQL>INSERT INTO Student
VALUES (123,'JOHN',SYSDATE);
1 row created.

SQL>DELETE Student;
1 row deleted.

我怎样才能找回这一行? 如果我使用

SQL>ROLLBACK;
Rollback complete.

但在那之后

SQL>SELECT * FROM Student;
no rows selected.

为什么会这样?

【问题讨论】:

    标签: oracle oracle11g rollback


    【解决方案1】:

    ROLLBACK 告诉 Oracle 回滚整个事务。在您的情况下,INSERT 和 DELETE 都是同一事务的一部分,因此 ROLLBACK 会反转这两个操作。这会将数据库返回到紧跟 CREATE TABLE 语句之后的状态。

    一些替代方案:

    1. 如果您要在INSERT 之后发出COMMIT,那么DELETE 语句将在一个单独的事务中,而ROLLBACK 将只反转DELETE 语句的效果。
    2. 您还可以在运行INSERT 语句后创建一个保存点,然后在DELETE 之后回滚到该保存点,而不是回滚整个事务。

    【讨论】:

    • 代替 SQL> 删除学生;我使用 SQL> DELETE FROM Student
    • 1 行已删除。然后使用 ROLLBACK;然后从学生中选择 *;它有效。
    • @bibhudash - 什么不起作用?您发布的所有内容似乎都按预期工作。如果这不是您想要的行为,您将需要更改您的代码。这就是为什么我给你几个不同的选项来改变你的代码。
    【解决方案2】:

    试试

    创建表 your_table 从员工中选择*; ALTER TABLE your_table 启用行移动; 更新 your_table SET CON_TYPE = 'N'; 闪回表 your_table TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' 分钟); /*如果要恢复表*/ FLASHBACK TABLE print_media TO BEFORE DROP; /*恢复其他名称的表*/ 在将重命名为 your_table 之前,闪回表 your_table;

    【讨论】:

      【解决方案3】:

      如果您不定期进行回滚,这可能会有点令人困惑。 如果不定期使用 SAVEPOINTS / ROLLBACK,我将您可能犯的错误放在这里。

      1.这是你的情况。我们将所有事务回滚到开头,即。到最后一次(隐式)提交


      2。这里我们有 SAVEPOINT 但没关系,因为它在 ROLLBACK 语句中没有提到。所以我们像以前一样回滚到最后一次提交。

      3.这很棘手。回滚仍然是最后一次提交,因为语法不正确(但 11g 数据库没有报告错误)。正确的语法是 ROLLBACK TO :

      4.最后我们有了正确的语法:ROLLBACK TO

      部分阅读:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9021.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-09
        • 1970-01-01
        • 2014-10-22
        • 1970-01-01
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多