2011-02-24 3 views
2

몇 가지 forall 루프에서 반복 할 sysid 컬렉션이 있습니다. 이 스크립트는 정기적으로 실행하기위한 것이므로 컬렉션이 데이터베이스에 유지되어 있는지 확인하고 스크립트를 그대로 유지해야하는지 알고 싶습니다.두 번 이상 실행해야하는 Oracle PL/SQL 스크립트에서 콜렉션을 지워야합니까?

또한 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; 

답변

5

컬렉션 로컬 변수이다. 그것을 지울 필요가 없습니다. PURGE_IN_PROCESS가 1 인 PERSON 테이블의 행 수에 따라 너무 많은 PGA 메모리를 사용하지 않으려면 LIMIT 절을 사용하는 것이 좋습니다.

그러나 정기적으로 실행되는 익명의 PL/SQL 블록에 대한 아이디어는 내게는 외계인입니다. 코드를 정기적으로 실행하려면 익명 블록이 아닌 저장 프로 시저를 만든 다음 정기적으로 프로 시저를 실행하도록 예약하는 것이 좋습니다. 이를 통해 데이터베이스 스케줄링 기능 (DBMS_JOB 및 DBMS_SCHEDULER)을 사용하여 프로세스를 실행하고 필요가 발생할 경우 다른 응용 프로그램에서도 호출 할 수 있습니다. 또한 데이터베이스에서 종속성 추적과 같은 작업의 이점을 누릴 수 있습니다.

0

저스틴은 정확합니다. 완전성을 위해, 저장된 PACKAGE로 변환하기로 결정했다면 PACKAGE 스펙에서 선언 한 모든 것이 전체 세션을 통해 그 값을 유지하므로 약간의주의를 기울여야한다.

관련 문제