8

我创建了表

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.

为什么会这样?

4

3 回答 3

20

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

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

在此处输入图像描述


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

在此处输入图像描述

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

在此处输入图像描述

4. 最后我们有了正确的语法:ROLLBACK TO <SAVEPOINT-NAME>

在此处输入图像描述

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

于 2018-08-22T20:54:28.023 回答
16

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

一些替代方案:

  1. 如果您要在 the 之后发出 a COMMITINSERT则该DELETE语句将在单独的事务中,并且ROLLBACK只会反转该DELETE语句的效果。
  2. 您还可以在运行语句后创建一个保存点INSERT,然后在运行后回滚到该保存点,DELETE而不是回滚整个事务。
于 2013-05-19T07:58:59.730 回答
0

尝试

    创建表 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;
于 2015-08-04T20:21:16.387 回答