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

kg.*_*kg. 2 sql oracle plsql oracle10g oracle11g

我有一个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;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 5

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

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