There are a number of restrictions on the type of queries which can be used for a fast refresh materialized view (far too many to go into here).
You also must have created a log on the source table(s) which record changes to the table since the last refresh of the mview.
Consider using the REFRESH FAST or REFRESH FORCE in the creation of the mview.
The following is directly from the Oracle docs and should point you in the right direction.
STORE (store_key, store_name, store_city, store_state, store_country)
PRODUCT (prod_key, prod_name, prod_brand)
TIME (time_key, time_day, time_week, time_month)
FACT (store_key, prod_key, time_key, dollar_sales)
/* create the materialized view logs */
CREATE MATERIALIZED VIEW LOG ON fact
CREATE MATERIALIZED VIEW LOG ON store
CREATE MATERIALIZED VIEW LOG ON time
CREATE MATERIALIZED VIEW LOG ON product
/*create materialized join view join_fact_store_time as incrementally
refreshable at COMMIT time */
CREATE MATERIALIZED VIEW join_fact_store_time
REFRESH FAST ON COMMIT AS
SELECT s.store_key, s.store_name, f.dollar_sales, t.time_key, t.time_day,
f.prod_key, f.rowid frid, t.rowid trid, s.rowid srid
FROM fact f, store s, time t
WHERE f.time_key = t.time_key AND
f.store_key = s.store_key;
I don't know of any Oracle support for this, maybe it's possible to determine the contents of the materialized view log on the source table - possibly through the system views or something - of that I don't know.
Secondary to that, you could disable automatic refresh of the mview. Then before refreshing your mview manually, you would do....
1: create table mview_temp as (select * from mview)
2: refresh your mview
3: select * from mview
select * from mview_temp
That should show you the changed rows, you'll have to do something else for deleted rows. Of course if the mview contains an awfull lot of data it's going to be time consuming.
Is it not possible to put an update date/time column on the source table, automatically refreshed with current sysdate for all updates/inserts?