Après un événement spécifique (par exemple, une personne ajoutez de nouvelles données dans la base de données via une interface graphique), j'ai besoin de rafraîchir une vue matérialisée qui prévoit certaines données et seulement après cette actualisation est complète, je dois interroger à la MW et à montrer à l'interface graphique. Résultats mis à jour.
Maintenant, mon problème est que j'ai besoin d'une façon de savoir quand l'actualisation est complète pour que je puisse ensuite interroger et vous assurer d'obtenir un résultat à jour.
Le MV est spécifié de cette manière:
CREATE MATERIALIZED VIEW ASSAY
("TYPE","METHOD",COMPOUND_CORPORATE_ID,RESULTS_AVG,RESULTS_ST_DEV,RESULTS_N)
AS
select "TYPE","METHOD",AVG("RESULTS"), STDDEV("RESULTS") , COUNT("RESULTS")
from ASSAY_INHIB
where upper("VALIDATION")='YES'
group by "TYPE","METHOD",COMPOUND_CORPORATE_ID;
CREATE INDEX assays_inhib_parent ON ASSAY(compound_corporate_id);
ALTER MATERIALIZED VIEW ASSAY REFRESH FORCE ON DEMAND;
J'appelle à partir de l'interface graphique une procédure stockée avec la commande Exece Refresh_mv () et la procédure stockée est comme ceci:
CREATE PROCEDURE REFRESH_MV () AS
BEGIN
DBMS_MVIEW.REFRESH('ASSAY');
END REFRESH_MV;
Le problème est que je ne sais pas quand je peux interroger le MV et être sûr que les données sont à jour. Quelqu'un peut-il aider?
Merci
Vous vous avez dit-
Après un événement spécifique (par exemple, une personne ajoutez de nouvelles données dans la base de données via une interface graphique), j'ai besoin de rafraîchir une vue matérialisée qui prévoit certaines données et seulement après cette actualisation est complète, je dois interroger à la MW et à montrer à l'interface graphique. Résultats mis à jour ...
Vous pouvez utiliser ON COMMIT
Actualiser au lieu de ON DEMAND
Mais je viens de dire que cela peut être, pas sûr de votre besoin et de votre mise en œuvre.
Engagez-vous rafraîchir
Une vue matérialisée peut être rafraîchie automatiquement à l'aide de la méthode de validation. Par conséquent, chaque fois qu'une transaction commise qui a mis à jour les tableaux sur lesquels une vue matérialisée est définie, ces modifications sont automatiquement reflétées dans la vue matérialisée. L'avantage d'utiliser cette approche est que vous ne devez jamais vous rappeler de rafraîchir la vue matérialisée.
La requête suivante peut être utilisée pour savoir quand le MV a été rafraîchi.
SQL> alter session set nls_date_format='dd/mm/yy hh24:mi:ss';
SQL> select owner, mview_name, last_refresh_type, last_refresh_date
from all_mviews;
Sortie d'échantillon:
USERNAME M_VIEW_TEST COMPLETE 02/02/17 01:01:19
Vous pouvez aussi utiliser v$mvrefresh
Vue de performance dynamique pour savoir quel MV est en train d'actualiser.
select currmvowner, currmvname from v$mvrefresh;
Références:
Je suppose que vous pouvez interroger les vues intégrées DBA_JOBS
et DBA_JOBS_RUNNING
avec la requête suivante:
SELECT
A.JOB JOB#,
SCHEMA_USER MVIEW_OWNER,
substr(DECODE(SUBSTR(WHAT,INSTR(WHAT,'.',1,2)+2,INSTR(WHAT,'”',1,4)-4-INSTR(WHAT,'.',1,2)+2),NULL,SUBSTR(WHAT,1,80),
SUBSTR(WHAT,INSTR(WHAT,'.',1,2)+2,INSTR(WHAT,'”',1,4)-4-INSTR(WHAT,'.',1,2)+2)),0,80) JOB_DESCRIPTION,
to_char(LAST_DATE, 'yyyy-mm-dd hh24:mi:ss') LAST_RUN_DATE,
to_char(NEXT_DATE, 'yyyy-mm-dd hh24:mi:ss') NEXT_SCHED_RUN_DATE,
DECODE(BROKEN,'Y','YES','N','NO',' ') IS_BROKEN,
FAILURES,
RUNNING IS_RUNNING,
B.SID SID
FROM DBA_JOBS A LEFT OUTER JOIN (SELECT JOB,'YES' RUNNING,SID FROM DBA_JOBS_RUNNING ) B
ON A.JOB = B.JOB
ORDER BY SCHEMA_USER, JOB_DESCRIPTION;