Domanda

Di recente ho notato che chiamare dbms_mview.refresh (...), che aggiorna le viste materializzate in Oracle, ha un impegno implicito.

Qualunque idea diversa da " perché fa " - perché questa azione ha un impegno implicito?

È stato utile?

Soluzione

A seconda della versione di Oracle e / o dei parametri forniti, dbms_mview.refresh potrebbe eseguire un TRUNCATE seguito da un carico diretto. TRUNCATE è un comando DDL e pertanto emette un commit implicito. Il caricamento diretto non richiede un commit.

Se stai usando una versione più recente di Oracle, penso 10.2+, puoi impostare il parametro atomic_refresh su TRUE e si aggiorna all'interno di una singola transazione, usando DELETE / INSERT standard. Questo metodo potrebbe essere un po 'più lento però.

Altri suggerimenti

Secondo Tom Kyte è perché in fase di progettazione è stata presa la decisione di considerare l'aggiornamento come un'operazione DDL . Dal momento che tutte le operazioni DDL commettono implicitamente, così fa anche questa. Sfortunatamente non risponde alla domanda che ne risulta sul perché scelgono di farlo DDL.

Una soluzione è quella di eseguire la chiamata a dbms_mview.refresh in una transazione autonoma (creare una procedura PL / SQL con pragma autonomous_transaction).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top