如何从Oracle中的表中删除数据

时间:2015-06-28 07:10:24

标签: sql oracle sql-delete

任何人都可以帮我检索Oracle SQL * Plus中删除的数据吗?

这里是数据已被删除的两个表。被告知只有当前日期的数据(T_DT = 28-JUN-15')被意外删除而销售中心ID(SC_CD)被选为27。

SQL> desc targ_mas
 Name                            Null?    Type
 ------------------------------- -------- ----
 SC_CD                           NOT NULL VARCHAR2(2)
 FP_ID                           NOT NULL VARCHAR2(4)
 T_DT                            NOT NULL DATE
 T_PCT                                    NUMBER(3)
 T_TARG                                   NUMBER(9,2)
 FL_MVH                          NOT NULL VARCHAR2(1)

SQL> 
SQL> 
SQL> desc prod_targ
 Name                            Null?    Type
 ------------------------------- -------- ----
 ASM_ID                                   VARCHAR2(4)
 RM_ID                                    VARCHAR2(4)
 FM_ID                                    VARCHAR2(4)
 FP_ID                           NOT NULL VARCHAR2(4)
 SC_CD                           NOT NULL VARCHAR2(2)
 TYP_CD                          NOT NULL VARCHAR2(2)
 DIV_CD                                   VARCHAR2(1)
 CAT_CD                          NOT NULL VARCHAR2(2)
 PRD_CD                          NOT NULL VARCHAR2(4)
 T_DT                            NOT NULL DATE
 QTY_TARG                                 NUMBER(8,2)
 T_VAL                                    NUMBER(10,2)
 TP_VAL                                   NUMBER(9,2)
 BR_CD                                    VARCHAR2(3)
 BS_CD                                    VARCHAR2(4)
 RMBS_CD                                  VARCHAR2(2)

用于从两个表中删除数据的查询:

delete from targ_mas
where sc_cd = '27'
and t_dt = '28-JUN-15'


delete from prod_targ
where sc_cd = '27'
and t_dt = '28-JUN-15'

1 个答案:

答案 0 :(得分:2)

假设已经提交了此更改,您最好的希望是启用了闪回。如果这样做,您可以将其检索到为此目的创建的表中:

CREATE TABLE targ_mas_recov AS (
    SELECT * AS OF TIMESTAMP SYSDATE - 1 # E.g., the data from yesterday
    FROM   targ_mas
    WHERE  sc_cd = '27' AND t_dt = '28-JUN-15'
);

CREATE TABLE prod_targ_recov AS (
    SELECT * AS OF TIMESTAMP SYSDATE - 1 # E.g., the data from yesterday
    FROM prod_targ
    WHERE sc_cd = '27' AND t_dt = '28-JUN-15'
);

或者,如果没有在这些表上执行您要保留的其他更新/删除/插入语句,则可以直接闪回它们:

FLASHBACK TABLE targ_mas TO TIMESTAMP SYSDATE - 1;
FLASHBACK TABLE prod_targ TO TIMESTAMP SYSDATE - 1;

如果这些更改已经提交但您没有启用闪回,我恐怕您唯一的选择就是从备份中恢复。