特定のイベント(たとえば、誰かがGUIを介してデータベースに新しいデータを追加する)の後、一部のデータを集約するマテリアライズドビューを更新する必要があります。更新が完了した後でのみ、MWからクエリを実行してGUIにGUIを表示する必要があります。更新された結果。
さて、私の問題は、更新がいつ完了したかを知る方法が必要であることです。これにより、クエリを実行して、最新の結果を確実に取得できます。
MVは次のように指定されます。
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;
GUIからコマンドexec REFRESH_MV()を使用してストアドプロシージャを呼び出します。このストアドプロシージャは次のようになります。
CREATE PROCEDURE REFRESH_MV () AS
BEGIN
DBMS_MVIEW.REFRESH('ASSAY');
END REFRESH_MV;
問題は、いつMVにクエリを実行できるかわからず、データが最新であることを確認することです。誰か助けてもらえますか?
ありがとう
あなたは言った-
特定のイベント(たとえば、誰かがGUIを介してデータベースに新しいデータを追加する)の後、一部のデータを集約するマテリアライズドビューを更新する必要があります。更新が完了した後でのみ、MWからクエリを実行してGUIにGUIを表示する必要があります。更新された結果...
ON COMMIT
の代わりにON DEMAND
リフレッシュを使用できますが、先ほど言ったように、要件と実装については不明です。
コミット時のリフレッシュ
マテリアライズドビューは、ON COMMITメソッドを使用して自動的に更新できます。したがって、マテリアライズドビューが定義されているテーブルを更新したトランザクションがコミットされると、それらの変更は自動的にマテリアライズドビューに反映されます。このアプローチを使用する利点は、マテリアライズドビューを更新することを覚えておく必要がないことです。
次のクエリは、MVが最後に更新された時期を知るために使用できます。
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;
出力例:
USERNAME M_VIEW_TEST COMPLETE 02/02/17 01:01:19
v$mvrefresh
動的パフォーマンスビューを使用して、どのMVが更新されているかを知ることもできます。
select currmvowner, currmvname from v$mvrefresh;
参考文献:
組み込みのビューをクエリできると思いますDBA_JOBS
およびDBA_JOBS_RUNNING
次のクエリを使用:
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;