【问题标题】:Loop for deleting large amount循环删除大量
【发布时间】:2020-07-13 08:27:40
【问题描述】:

我需要以最快的方式从 50 条记录中删除 2000 万条记录。我尝试使用下面的循环来完成这项工作:

LOOP
  DELETE FROM dssoti.appt_purge WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17' AND ROWNUM < 200000;
  EXIT WHEN SQL%ROWCOUNT = 0;
  COMMIT;
END LOOP;

但是当我执行它时它不会循环,它只会删除 199,999 条记录。我在这里做错了什么?我正在使用 oracle SQL 开发人员版本 18

【问题讨论】:

  • 你为什么要把删除放在一个循环中?你在执行其他逻辑吗?
  • 另外,还有一篇关于如何快速删除东西的 AskTom 文章。看看:AskTOM。它特别警告您的循环构造。
  • 只是为了清楚。您是说循环内的代码执行一次?你怎么知道的?
  • 执行脚本输出后显示“已删除 199,999 条记录”,当我计算记录以确认其准确无误时。
  • 完全没有循环,因为满足条件,它会一次性删除。您想逐条删除还是说每 100000 条记录或您喜欢的任何数字?

标签: oracle loops delete-row large-data-volumes


【解决方案1】:

rownum = 200000 不小于 200,000,因此您最终只删除了 199,999 条记录。

你需要使用ROWNUM &lt;= 200000,如下:

更新了循环问题的代码

FOR I IN (SELECT trunc(count(1)/200000) +1 from dssoti.appt_purge 
   WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17')
LOOP
  DELETE FROM dssoti.appt_purge 
   WHERE to_date(substr(apntmt_dt,0,9)) < '01-JAN-17' AND ROWNUM <= 200000; -- change this
  --EXIT WHEN SQL%ROWCOUNT = 0;
  COMMIT;
END LOOP;

【讨论】:

  • 一次只删除 199,999 条我没问题,问题是它没有执行循环,只是删除了一组记录
  • 相同的结果 & : Error starting at line : 1 in command - FOR I IN (SELECT trunc(count(1)/200000) +1 from dssoti.appt_purge Error report - Unknown Command SP2-0044: For a list of known commands enter HELP and to leave enter EXIT. Error starting at line : 2 in command - WHERE to_date(substr(apntmt_dt,0,9)) &lt; '01-JAN-17') Error report - Unknown Command Error starting at line : 3 in command - LOOP Error report - Unknown Command 200,000 rows deleted. Commit complete. Error starting at line : 8 in command - END LOOP Error report - Unknown Command
  • @MariaBoggi 希望这不是产品,请确保您在开发环境中测试小样本表有时会意外删除整个表。如果可能,请在 sql 开发人员和数据类型中发布完整代码aptmnt_dt.
【解决方案2】:

我的问题不包括脚本前后的beginend

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多