在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?

Posted

技术标签:

【中文标题】在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?【英文标题】:In an Oracle PL/SQL script meant to run more than once, does the collection need to be cleared out?在打算多次运行的 Oracle PL/SQL 脚本中,是否需要清除集合? 【发布时间】:2011-02-24 20:01:20 【问题描述】:

我有一个 sysid 集合,用于在多个 forall 循环中进行迭代。该脚本旨在定期运行,因此我想知道该集合是否保留在数据库中并需要清除,或者该脚本是否正常。

另外,我是 PL/SQL 的新手,所以如果您发现脚本有任何问题,请告诉我。

这将在 Oracle 10g 和 11g 上运行。

谢谢

DECLARE

TYPE sSysid IS TABLE OF person.sysid%TYPE
    INDEX BY PLS_INTEGER;

l_sSysid sSysid;

BEGIN
    SELECT sysid
    BULK COLLECT INTO l_sSysid
        FROM person
        where purge_in_process = 1;

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person_attribute where property_pk like concat(l_sSysid(i), '%');

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person_property where person_sysid = l_sSysid(i);

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person where sysid = l_sSysid(i);


END;
/
commit;

【问题讨论】:

【参考方案1】:

集合是一个局部变量,因此在块执行完成后它将不再存在。没有必要清除它。根据 PERSON 表中 PURGE_IN_PROCESS 为 1 的行数,您可能希望使用 LIMIT 子句以避免消耗过多的 PGA 内存。

但是,定期运行的匿名 PL/SQL 块的想法对我来说有点陌生。如果您打算定期运行代码,我强烈建议您创建一个存储过程而不是匿名块,然后安排该过程定期运行。这开启了使用数据库的调度工具(DBMS_JOB 和 DBMS_SCHEDULER)运行进程的能力,并允许其他应用程序在需要时调用它。此外,您还将受益于数据库中的依赖跟踪等功能。

【讨论】:

【参考方案2】:

贾斯汀是正确的;但为了完整起见,我将补充一点,如果您决定将其转换为存储的 PACKAGE,则需要格外小心,因为您在 PACKAGE 规范中声明的任何内容都会在整个会话中保留其价值。

【讨论】:

以上是关于在打算多次运行的 Oracle PL/SQL 脚本中,是不是需要清除集合?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle及PL SQL常用功能

有没有办法在 Oracle 中刷新 PL/SQL 的输出?

有没有办法在 Oracle 中刷新 PL/SQL 的输出?

使用 OCCI oracle 在 C++ 中执行 PL/SQL 脚本

Oracle_PL/SQL(10) 定时器job

运行 pl/sql 脚本时遇到问题