Falha ao atualizar view materializada com REFRESH FAST ON DEMAND

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
andersonrc_
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 12 Fev 2018 2:51 pm

Preciso criar uma view materializada que será atualizada em determinados horários do dia utilizando REFRESH FAST ON DEMAND, como se trata de milhões de registros, a opção ON COMMIT, está descartada. Mesmo criando as tabelas de log para as tabelas de origem, a view não está sendo atualizada quando ocorre inserts nas tabelas de origem.

Ao verificar os logs de execução do job, encontro o log a seguir:

Selecionar tudo

ORA-12004: REFRESH FAST não pode ser utilizado para view materializada “DESV”.”VM_LOG_EMPRESTIMO”
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 3012
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 2424
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 88
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 253
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 2405
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 2968
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 3255
ORA-06512: em “SYS.DBMS_SNAPSHOT_KKXRCA”, line 3287
ORA-06512: em “SYS.DBMS_SNAPSHOT”, line 16
ORA-06512: em “DESV.REFRESH_VM_LOG_EMPRESTIMO”, line 4

A seguir, estão todos os códigos:

-- criação da view materializada com a opção refresh force on demand (depois é que altero para fast)

Selecionar tudo

create materialized view vm_log_emprestimo
refresh force on demand
as select u.nomeusuario, l.nomelivro, a.nomeautor ,e.dataemprestimo, e.datadevolucao
from usuario u join emprestimo e
on (u.codusuario = e.codusuario) join livro l
on (e.codlivro = l.codlivro) join autor a
on(l.codautor = a.codautor);
-- criação das tabelas de log

Selecionar tudo

CREATE MATERIALIZED VIEW log ON usuario WITH ROWID;
CREATE MATERIALIZED VIEW log ON emprestimo WITH ROWID;
CREATE MATERIALIZED VIEW log ON livro WITH ROWID;
CREATE MATERIALIZED VIEW log ON autor WITH ROWID;
-- alteração da view para refresh fast on demand

Selecionar tudo

ALTER MATERIALIZED VIEW vm_log_emprestimo REFRESH FAST ON DEMAND;
-- criação da procedure para executar o refresh na view

Selecionar tudo

CREATE OR REPLACE PROCEDURE refresh_vm_log_emprestimo
AS
BEGIN
    DBMS_MVIEW.REFRESH('vm_log_emprestimo');
END;
/
-- criação do job que vai executar a procedure

Selecionar tudo

BEGIN
dbms_scheduler.create_job (
   job_name           =>  'mview_vm_log_emprestimo',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'refresh_vm_log_emprestimo',
   start_date         =>  SYSTIMESTAMP,
   end_date           => NULL,
   repeat_interval    =>  'FREQ=DAILY; byhour=18,20,22,00',
   enabled            =>  TRUE
);
END;
/
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pelo que eu to vendo, tem que usar apenas REFRESH a primeira vez.
Depois o REFRESH FAST vai estar disponível.

Selecionar tudo

ORA-12004: REFRESH FAST cannot be used for materialized view "string"."string"

Cause: The materialized view log does not exist or cannot be used. 
PCT refresh is also not enabled on the materialized view

Action: Use just REFRESH, which will reinstantiate the entire table. If a materialized 
view log exists and the form of the materialized view allows the use of a materialized 
view log or PCT refresh is possible after a given set of changes, REFRESH FAST will 
be available starting the next time the materialized view is refreshed.

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 32 visitantes