Non esiste un metodo diretto; dovrai analizzare i registri (come indicato in un'altra risposta) oppure utilizzare metodi alternativi per vedere cosa sta succedendo in un processo a lungo termine.
Personalmente, suggerisco di utilizzare transazioni autonome per abilitare questa funzione, non sulla transazione stessa, ma come meccanismo di registrazione che ti consente di sapere cosa sta succedendo. Ad esempio, è possibile che PROCEDURE LONG_ACTION chiami PROCEDURE WRITE_LOG_ENTRY (definita come transazione autonoma) che scriva un VARCHAR2 su un'altra tabella. Le transazioni autonome NON interferiscono con la transazione corrente (dal punto di vista LOGICO; attenzione ai potenziali impatti sulle prestazioni) e quindi è possibile vedere cosa sta succedendo tramite le voci di registrazione indipendentemente da COMMIT o ROLLBACK nella transazione corrente. Detto questo, puoi farlo con un'enorme dichiarazione DML; dovresti usare un ciclo.
Ritenere:
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;
Considerato quanto sopra, otterrai una voce di registro per ogni 500 righe elaborate indipendentemente dal successo dell'azione lunga. Se hai bisogno di un duplicato esatto dei dati per vedere come funziona, ti suggerisco di creare una tabella duplicata e di chiamare una procedura che duplicherà i dati (la procedura è una transazione autonoma). Dopodiché, annulla i dati. (Non è necessario duplicare.)
Inoltre, se questo è a scopo di debug, suggerisco di rimuovere o ridurre drasticamente la necessità di tale registrazione quando le cose sono state testate. E, come sempre, testare, testare, testare sul proprio sistema per verificare come funzioneranno le cose. (Vedi il commento di Niall per un buon esempio di come la registrazione può influenzare drasticamente le prestazioni.)
(Infine, perché ho dimenticato di menzionarlo prima: attenzione alle transazioni autonome. Comprenderle completamente prima dell'implementazione e non utilizzarle "solo perché". Possono essere utilizzate in modo errato in milioni di modi (ad esempio, TENTARE di evitare un errore mutato in un trigger), quindi è sempre meglio trovare alternative, se possibile. Se non è possibile, procedere con cautela. La registrazione durante operazioni a lungo termine è sempre stata un caso in cui è abbastanza sicuro (ignorando problemi di prestazioni), ma non affrettarti ad applicarlo ad altri usi senza conoscerne le conseguenze.)