Oracle大量刪除資料方案

2021-05-27 21:26:59 字數 2698 閱讀 4915

網友觀點一:

create or replace procedure delete_table

isi number(10);

begin

for x in (select * from emp where deptno like 'a%')

loop

delete emp where emp.id = x.id

i:=i+1;

if i>1000 then

commit;

i:=0;

end if;

end loop;

exception

when others then

dbms_out.put_line(sqlcode);

rollback;

end delete_table;

網友觀點二:

這個是我平常用來批量刪除資料,每500條資料提交一次。

declare

cnt number(10):=0;

i number(10);

begin

select count(*) into cnt from ep_arrearage_bak where to_char(df_date,'mm')='01';

for i in 1..trunc(cnt/500)+1 loop

delete from ep_arrearage_bak where to_char(df_date,'mm')='01' and rownum<=500;

commit;

end loop;

end;

專家意見:幾個辦法:

1. 如果刪除的資料是大部分,建議使用樓上的方法把要保留的資料放在乙個臨時表裡,truncate table後再放回來

2. 也可以分段提交,樓上也提到了

3. 專門使用乙個大回滾段

4. 如果確認將來不需要做恢復,改為非歸檔模式,刪除完改回來再做個備份.

專家給出的解決方案:

有條件的分步刪除資料表中的記錄

--建立測試表

create table test as select * from dba_objects;

table created.

--建立刪除表的儲存過程

create or replace procedure deletetab

--插入語句

sql> insert into test select * from dba_objects;

6374 rows created.

sql> /

6374 rows created.

sql> /

6374 rows created.

sql> commit;

--建立刪除的儲存過程

create or replace procedure deletetab

/**** usage: run the script to create the proc deletetab

**        in sql*plus, type "exec deletetab('foo','id>=1000000','3000');"

**        to delete the records in the table "foo", commit per 3000 records.

** condition with default value '1=1' and default commit batch is 10000.

**/(

p_tablename    in    varchar2,    -- the tablename which you want to delete from

p_condition    in    varchar2 default '1=1',    -- delete condition, such as "id>=100000"

p_count        in    varchar2 default '10000'    -- commit after delete how many records)as

pragma autonomous_transaction;

n_delete number:=0;

begin

while 1=1 loop

execute immediate

'delete from '||p_tablename||' where '||p_condition||' and rownum <= :rn'

using p_count;

if sql%notfound then

exit;

else

n_delete:=n_delete + sql%rowcount;

end if;

commit;

end loop;

commit;

dbms_output.put_line('finished!');

dbms_output.put_line('totally '||to_char(n_delete)||' records deleted!');

end;/

--執行語句

sql> exec deletetab('test','object_id >0','10000')

你看看執行結果我試驗過,效果還可以

oracle大表刪除資料方案

需求簡介 生產資料庫乙個表有27億多資料,要刪除其中其中2014年之前的歷史資料 大約4億左右 表資訊 5個字段的主鍵 乙個欄位的單列索引 hash分割槽。資料庫情況 每日1 00 9 00會跑增量資料程式,其他sql不能影響增量程式。所以資料要在9 00 24 00之內跑完 解決方案1 delet...

oracle大量資料刪除

oracle有個資料表現在已經有2500萬條資料了,軟體用到這個表的資料時就變的特別慢,所以準備把乙個月以前的資料全部清除。我的步驟是 下邊操作都是在plsql中執行的 1 首先 將這個月的資料匯出到乙個臨時表中 這些資料是自己希望保留的 create table temptable as sele...

oracle刪除資料

oracle在表中刪除資料的語法是 語法結構 delete from表名 where 條件 演示 sql delete from infos where stuid s100103 1 row deleted sql commit truncate 在資料庫操作中,truncate命令 是乙個ddl...