a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數據庫 > Oracle > 正文

案例討論:批量刪除Oracle數據庫的數據

2024-08-29 13:50:09
字體:
來源:轉載
供稿:網友
在使用delete語句刪除數據時,數據庫是要做日志記錄的,以便將來可以恢復數據,可是我在刪除上百萬條數據時,十分緩慢甚至死機,請問有沒有什么好方法?   網友觀點一:
create or replace PRocedure delete_table
is
i 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 DBA面試題

下一篇:Oracle學習快速入門基礎教程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 美日韩一区二区三区 | 人人草在线观看视频 | www.久久99 | 操操网站 | 亚洲一区二区免费在线观看 | 99福利视频| av高清在线免费观看 | 精品视频久久 | 成人精品鲁一区一区二区 | 黄色成人av | 国产精品久久久久久久久久久久久 | 欧美lesbianxxxxhd视频社区 | 少妇av片| 一区二区在线影院 | xoxo国产三区精品欧美 | 精品欧美一区二区三区 | 91精品福利 | 婷婷色站| 欧洲中文字幕 | 91精品亚洲 | 91精品综合久久久久久五月天 | 精品国产91亚洲一区二区三区www | 国产一级中文字幕 | 久久亚洲春色中文字幕久久久 | 久草天堂 | 久久网站热最新地址 | 国产区免费观看 | 成人免费一区二区三区视频网站 | 欧美福利一区 | 一区二区三区精品 | 日韩手机专区 | 福利在线观看 | 久久免费视频播放 | 欧美精品一区二区三区四区 | 婷婷精品久久久久久久久久不卡 | www日本高清视频 | 18成人在线观看 | 99精品播放| 成人三级在线 | 日韩免费福利视频 | 中文字幕一区二区三区四区不卡 |