我创建了表
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.
为什么会这样?
答案 0 :(得分:9)
ROLLBACK
告诉Oracle回滚整个事务。在您的情况下,INSERT
和DELETE
都是同一事务的一部分,因此ROLLBACK
会反转这两项操作。这会使数据库返回到CREATE TABLE
语句后面的状态。
一些替代方案:
COMMIT
之后发出INSERT
,则DELETE
语句将在单独的交易中,而ROLLBACK
将仅反转DELETE
的效果{1}}陈述。INSERT
语句后创建保存点,然后在DELETE
之后回滚到该保存点,而不是回滚整个事务。答案 1 :(得分:4)
如果您不定期进行回滚,这可能会使您感到困惑。 如果您不定期使用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
答案 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;