직접적인 방법은 없습니다. 다른 답변에서 언급 한대로 로그를 구문 분석하거나 대체 방법을 사용하여 장기 실행 프로세스에서 발생하는 상황을 확인해야합니다.
개인적으로이 기능을 활성화하기 위해 자율 트랜잭션을 사용하는 것이 좋습니다. 트랜잭션 자체가 아니라 진행 상황을 알려주는 로깅 메커니즘입니다. 예를 들어, VARCHAR2를 다른 테이블에 쓰는 PROCEDURE LONG_ACTION 호출 PROCEDURE WRITE_LOG_ENTRY (자율 트랜잭션으로 정의)가있을 수 있습니다. 자율적 트랜잭션은 (논리적 관점에서, 현재의 트랜잭션에 영향을 줄 수 있으므로) 현재 트랜잭션을 방해하지 않으므로 현재 트랜잭션의 COMMIT 또는 ROLLBACK에 관계없이 로깅 항목을 통해 진행중인 작업을 확인할 수 있습니다. 즉, 하나의 대규모 DML 문으로이를 수행 할 수 있습니다. 루프를 사용해야합니다.
치다:
TABLE LOG_ENTRIES defined as
activity_date date,
log_entry varchar2(2000)
TABLE BIG_JOB (definition doesn't really matter)
PROCEDURE WRITE_LOG_ENTRY
( str VARCHAR2 )
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO LOG_ENTRIES VALUES ( SYSDATE, str );
COMMIT;
END;
PROCEDURE LONG_ACTION IS
c NUMBER;
BEGIN
FOR r IN ( SELECT * FROM BIG_JOB )
LOOP
c := c + 1;
UPDATE BIG_JOB z
SET fld = hairy_calculation
WHERE z.rowid = r.rowid;
IF MOD(c,500) = 0 THEN
WRITE_LOG_ENTRY ( c || ' rows processed.' );
END IF;
END LOOP;
COMMIT;
END;
위와 같이 긴 작업의 성공 여부에 관계없이 500 행마다 로그 항목이 처리됩니다. 데이터가 작동하는 것을 확인하기 위해 데이터의 정확한 복제본이 필요한 경우 복제 테이블을 만들고 데이터를 복제하는 프로 시저 (자치 트랜잭션 인 프로 시저)를 호출하는 것이 좋습니다. 그런 다음 사후에 데이터를 정리하십시오. (중복 할 필요가 없습니다.)
또한 이것이 디버깅 목적이라면 테스트를 수행 할 때 이러한 로깅의 필요성을 제거하거나 대폭 줄이십시오. 그리고 항상 그렇듯이 테스트, 테스트 및 테스트를 수행하여 시스템 작동 방식을 검증하십시오. 로깅이 성능에 큰 영향을 미치는 방법에 대한 좋은 예는 Niall의 설명을 참조하십시오.
(마지막으로, 나는 그것을 언급하지 않았기 때문에 : 자율적 인 거래를 조심하십시오. 구현하기 전에 완전히 이해하고 "그냥 이유"로 사용하지 마십시오. 그들은 백만 가지 방식으로 잘못 사용될 수 있습니다 (예 : 트리거에서 뮤트 오류를 피하십시오.) 가능하면 항상 대안을 찾는 것이 가장 좋습니다. 그렇지 않으면주의해서 진행하십시오. 성능 문제), 그러나 결과를 모른 채 다른 용도로 적용하기 위해 서두르지 마십시오.)