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)
该集合是一个局部变量,因此在块完成执行后它将不再存在.没有必要清除它.根据PERSON表中PURGE_IN_PROCESS为1的行数,您可能希望使用LIMIT子句,以避免消耗过多的PGA内存.
然而,定期运行的匿名PL/SQL块的想法对我来说有点陌生.如果您打算定期运行代码,我强烈建议您创建存储过程而不是匿名块,然后安排程序定期运行.这开启了使用数据库的调度工具(DBMS_JOB和DBMS_SCHEDULER)来运行进程的能力,并允许其他应用程序在需要时调用它.此外,您将获得数据库中依赖关系跟踪等优势.