批量刪除Oracle資料庫的資料

2021-09-02 18:18:38 字數 2707 閱讀 4012

在使用delete語句刪除資料時,資料庫是要做日誌記錄的,以便將來可以恢復資料,可是我在刪除上百萬條資料時,十分緩慢甚至宕機,請問有沒有什麼好方法?[@more@]

網友觀點一:

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資料庫

odp技術,引數可以為陣列 注意事項 1 時間處理 防止資料庫中有date型別的資料,不設定格式則會出現無效月份的情況,如 new oracledate 2011 08 26 17 18 19 oracleglobalization og oracleglobalization.getclienti...

資料批量匯入Oracle資料庫

表resultxt 3 行載入成功 由於資料錯誤,0 行沒有載入。由於所有 when 子句失敗,0 行沒有載入。由於所有欄位都為空的,0 行沒有載入。為結合陣列分配的空間 65016位元組 63行 除繫結陣列外的記憶體空間分配 0位元組 跳過的邏輯記錄總數 0 讀取的邏輯記錄總數 3 拒絕的邏輯記錄...

Oracle資料庫 刪除資料庫

1 單擊 開始 oracle oradb12home1 database configuration assistant 進入刪除步驟的第一步,選擇 刪除資料庫 2 單擊 下一步 按鈕,如圖所示。在資料庫列表中選擇需要刪除的資料,例如test,並輸入使用者名稱和口令。3 單擊 下一步 按鈕,開啟 管...