【问题标题】: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;

【问题讨论】:

    标签: sql oracle plsql oracle10g oracle11g


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        相关资源
        最近更新 更多