Pregunta

Recientemente noté que llamar a dbms_mview.refresh (...), que actualiza las vistas materializadas en Oracle, tiene una confirmación implícita.

Cualquier idea, que no sea "porque lo hace" - ¿Por qué esta acción tiene una confirmación implícita?

¿Fue útil?

Solución

Dependiendo de su versión de Oracle y / o los parámetros que proporcione, dbms_mview.refresh puede estar haciendo un TRUNCATE seguido de una carga directa. TRUNCATE es un comando DDL y, como tal, emite una confirmación implícita. La carga directa no requiere una confirmación.

Si está utilizando una versión más reciente de Oracle, creo que 10.2+, puede establecer el parámetro atomic_refresh en TRUE y se actualizará en una sola transacción, utilizando DELETE / INSERTs estándar. Sin embargo, este método podría ser bastante más lento.

Otros consejos

Según Tom Kyte, es porque se tomó la decisión en tiempo de diseño de considerar la actualización como una operación DDL . Como todas las operaciones DDL se comprometen implícitamente, esta también lo hace. Desafortunadamente, no responde la pregunta resultante de por qué eligen hacerlo DDL.

Un trabajo alrededor es hacer la llamada a dbms_mview.refresh en una transacción autónoma (crear un procedimiento PL / SQL con pragma autonomo_transacción).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top