使用PL/SQL删除大量记录

2024-02-22

我想使用PL/SQL删除大量记录。这些记录由 DATE 字段标识,该字段标识上次修改记录的时间。我不想消耗太多资源,因此我认为应该限制要删除的记录数量,在我看来,伪列 ROWNUM 可以满足此目的。然后,我检查受更新影响的行数并重复,直到影响的行数为 0。

我正在寻找有关执行此操作的最佳实践的建议。我还担心我收到的警告:

“包含 DML 语句的循环应重构为使用 BULK COLLECT 和 FORALL。”

但是当我用谷歌搜索这个主题时,似乎这并不适用于我想做的事情——或者是吗?

欢迎您提出意见和建议。

CREATE OR REPLACE PACKAGE BODY MY_PURGE
AS
   PROCEDURE PURGE_MY_TABLE (v_Cut_Off_Date   IN     DATE,
                                 C_MAX_DELETE     IN NUMBER,
                                 DEL_COUNT        OUT NUMBER)
   IS
      v_RECORDS_DELETED   NUMBER := 0;
      V_DONE              BOOLEAN := FALSE;
   BEGIN
      DEL_COUNT := 0;

      WHILE NOT V_DONE
      LOOP
         DELETE FROM MYTABLE
               WHERE     UPDT_TIMESTMP < v_Cut_Off_Date
                     AND ROWNUM <= C_MAX_DELETE;

         v_RECORDS_DELETED := SQL%ROWCOUNT;
         DEL_COUNT := DEL_COUNT + v_RECORDS_DELETED;

         IF (v_RECORDS_DELETED = 0)
         THEN
            V_DONE := TRUE;
         END IF;

         COMMIT;
      END LOOP;
   END;

Thanks


您担心消耗哪些资源?单个DELETE声明将是最有效的方法*。假设这是需要定期完成的事情,那么数据库的大小确实应该根据以下方面进行适当调整:UNDO表空间允许您执行单个DELETE.

实际上,退一步来说,最有效的方法是按UPDT_TIMESTMP并删除旧分区。但分区是企业版许可证之外的额外成本选项,并且对表进行分区可能会对系统产生其他影响。

如果您确实需要通过临时提交批量删除行,那么这似乎是一个非常合理的实现。我真的只会考虑这个,如果单身DELETE声明占用了我每晚处理窗口的很大一部分,我担心DELETE几个小时后可能会失败,强制回滚并重新启动整个过程。批量删除比单个删除慢DELETE通常,但重新启动会更容易。

使用建议BULK COLLECT and FORALL在这种特殊情况下没有意义。它适用于一种更常见的情况,即有人从一个或多个源表中选择数据,在 PL/SQL 中进行一些处理,然后将数据写入目标表。通过批量操作而不是通过缓慢的逐行处理来实现这一点会更有效。但如果单独进行的话,效率会更高INSERT ... SELECT.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用PL/SQL删除大量记录 的相关文章

  • 使用 Oracle PL/SQL 存储过程授予其他用户表的权限

    我遇到了执行以下操作的应用程序的问题 PL SQL 包 A 包含应用程序的所有函数 过程 A 由 USER A 拥有 A 在 Oracle 中创建用户帐户 并在这些用户下创建表 A 还必须能够 TRUNCATE INSERT 到用户的表 注
  • 在游标内使用 Merge 语句

    我们需要填充一个主表 该表由 20 个不同表中的列组成 我编写了一个存储过程来连接一些返回最大列数的表并将它们放在游标中 现在 我正在使用 for 循环来迭代游标记录 以便可以将它们插入主表中 如何在游标 for 循环内使用合并语句 以便我
  • 如何在表上选择并计算某些值的出现次数

    我请求你的帮助 因为我不太了解 SQL 我需要计算表列中某些值的出现次数 以达到类似统计表的效果 如下图所示 需要的结果 Comment 我的结果表需要有前两列 国家和站点 来自第一个表 Violations 接下来的 5 列将包含状态表中
  • 通过列名动态访问游标

    我可以动态访问游标的列吗 我的意思是名字 像这样的东西 declare v cursor select from emp begin FOR reg IN v cursor LOOP dbms output put line reg col
  • PL/SQL 中的 BEGIN - END 块原子事务

    这些信息应该很容易找到 但我没有任何运气 当我有一个BEGIN ENDPL SQL 中的块 它是否表现为原子事务 它将尝试在命中时提交END阻止 如果出现问题会回滚更改吗 如果不是 我如何确保 BEGIN END 块内的代码的行为类似于原子
  • 将数据持久保存在 Oracle 数据库的 docker 卷中

    我创建了用于存储我的应用程序数据库数据的卷 docker volume create dbvolume 然后我启动了带有 Oracle XE 11g 数据库映像和数据卷的 docker 容器 docker run name OracleXE
  • PL/SQL 中是否有方法将文本转换/编码为 XML 兼容文本?

    我的一位同事需要将 PL SQL 方法中的文本转换为符合 XML 的文本 因为他正在通过更新文本模板来构建 Excel 电子表格 PL SQL 中是否有方法将文本转换 编码为 XML 兼容文本 好吧 如果您只想转换 XML 字符 您需要执行
  • 从集合类型 Oracle 12c 插入表 - ORA-00902: 无效数据类型

    我正在使用 Oracle 12 1 我以为我可以查询 12c 中的表类型 当我尝试执行此包时 我收到错误 ORA 00902 无效数据类型 我什至尝试使用强制转换多重集 但仍然出现同样的错误 我知道我们可以在数据库级别创建对象然后查询 但我
  • 在Oracle中,是否可以将以逗号分隔的非常大的字符串(clob)转换为具有更好性能的表

    我需要通过逗号分隔符将非常大的 clob 字符串转换为表 下面的函数需要很长时间 有没有返回表的快速函数 create or replace FUNCTION UDF STRSPLIT2 P STR IN CLOB P DELIM IN V
  • 创建每 5 分钟刷新一次的物化视图

    我创建了一个每 5 分钟刷新一次的物化视图 但是当我在物化视图上插入并执行选择时 我会得到相同的旧数据吗 需要手动刷新吗 CREATE MATERIALIZED VIEW MVW TEST REFRESH FORCE ON DEMAND S
  • 如何使用 EclipseLink 处理以 Oracle 类型作为输入或输出的 Oracle 存储过程调用

    我进行了概念验证 以了解使用 EclipseLink 调用存储过程的效率如何 我能够使用带有标量 原始数据类型 链接整数 varchar 等 的 EclispeLink 来调用 Oracle 存储过程 我想了解如何使用集合 Oracle 类
  • ORACLE:未找到数据——但数据存在

    调试包过程 当实际上有数据时却找不到数据 仅测试 SELECT SELECT trim trailing from GL SECURITY as DUMMY FROM b2k user b2k WHERE sms username FUCH
  • 在 Toad 中调试 PLSQL

    我一直在使用 PL SQL 为 Oracle db 创建包 并且我正在尝试找到一种在不使用 put line 命令的情况下调试 PL SQL 包的好方法 是否有人对如何成功调试Toad 或 SQLPlus 上的 PL SQL 包 根据 TO
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • 如何使用 Oracle 移动文本文件

    我有两个问题 1 如何从文件夹中移动文本文件 C Data inbox test txt 目标文件夹 C Data outbox test txt 2 如何获取文件夹中的目录文件列表 C Data inbox 谢谢 Oracle 提供了一个
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • 如何在PL/SQL中模拟32位有符号整数溢出?

    您知道如何在 Oracle PL SQL 中模拟 32 位整数溢出吗 例如 2147483647 1 2147483648 or 2147483648 1 212147483647 我尝试了 PLS INTEGER 但它引发了溢出异常 我终
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • Oracle - 将字符串与 utl_raw.cast_to_varchar2 函数的结果连接起来

    我正在尝试将字符串连接到结果utl raw cast to varchar2函数 也是一个字符串 它应该是透明的 但我无法将任何内容附加到结果中utl raw cast to varchar2 这是一个例子 select utl raw c
  • 在 Oracle 中使用数据透视表的建议

    我需要一份报告 我应该使用数据透视表 报告将按类别分组 使用 case when 语句不好 因为有很多类别 您可以将 Northwind 数据库视为示例 所有类别将显示为列和报告将显示客户在类别中的偏好 我不知道另一个解决方案 并在互联网上

随机推荐