在Oracle中使用ROLLBACK命令

时间:2013-05-19 07:06:01

标签: oracle oracle11g rollback

我创建了表

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.

为什么会这样?

3 个答案:

答案 0 :(得分:9)

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

一些替代方案:

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

答案 1 :(得分:4)

如果您不定期进行回滚,这可能会使您感到困惑。 如果您不定期使用SAVEPOINTS / ROLLBACK,我可能会犯下这些错误。

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

enter image description here


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

enter image description here

3。这很棘手。由于语法不正确(但11g数据库未报告错误),因此回滚仍将转到最后一次提交。正确的语法是ROLLBACK TO

enter image description here

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

enter image description here

一些读物:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9021.htm

答案 2 :(得分:0)

尝试

    CREATE TABLE your_table
     AS SELECT * FROM employees;

     ALTER TABLE your_table
     ENABLE ROW MOVEMENT;

     UPDATE your_table
      SET CON_TYPE = 'N';

    FLASHBACK TABLE your_table
       TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);
           /*if you want to restore the table*/
       FLASHBACK TABLE print_media TO BEFORE DROP;

    /*Restore the table with other name*/
       FLASHBACK TABLE your_table TO BEFORE DROP RENAME TO your_table;