Da ich in den ODC Foren (früher OTN Foren) kaum etwas wiederfinde, hier ein Link auf eine Frage, die ich zu einem Verhalten gestellt habe, das mir zuletzt beim Refresh einer Materialized View mit Lateral Join begegnet war:
-- 12.2.0.1 SE create table t( col1 number , col2 varchar2(4000) ); insert into t(col1, col2) values(1, '[{"type":1,"target":42}]'); insert into t(col1, col2) values(2, '[{"type":1,"target":42},{"type":2,"target":43}]'); create materialized view t_mv as select t.col1, t.col2, r.val from t, LATERAL (SELECT MIN(val) AS val FROM JSON_TABLE ( t.col2, '$[*].target' COLUMNS (val NUMBER PATH '$') ) ) r; SQL> create materialized view t_mv 2 as 3 select t.col1, t.col2, r.val 4 from t, 5 LATERAL (SELECT MIN(val) AS val 6 FROM JSON_TABLE ( t.col2, '$[*].target' 7 COLUMNS (val NUMBER PATH '$') 8 ) 9 ) r; Materialized view created. SQL> exec dbms_mview.refresh('t_mv') BEGIN dbms_mview.refresh('t_mv'); END; * ERROR at line 1: ORA-00942: table or view does not exist ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 2952 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 2370 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 85 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 245 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 2352 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 2908 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 3191 ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 3221 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 15 ORA-06512: at line 1
Die Anlage der MView ist also zunächst erfolgreich, aber der complete refresh scheitert mit einem unerwarteten ORA-942-Fehler - obwohl die Tabelle im gleichen Schema liegt wie die MView. Ein Blick ins SQL Trace zur Operation zeigt, dass der Fehler offenbar die Statistikerstellung für ein transientes Objekt betrifft: eine VW_LAT, die natürlich nicht persitiert wird:
kkzfThrowError: error_pos = kkzfGetNumRows:OCIStmtPrepare2 errcode = 942 msgbuf =ORA-00942: table or view does not exist kkzfPrintError: error = 31933 btm = 0 emsglen = 137 ORA-31933: error occurred during refresh statistics processing at kkzfGetNumRows:OCIStmtPrepare2 ORA-00942: table or view does not exist kkzfSetupStatsCtxDrv:1: stats is disabled on error 31933 kkzfSetupStatsCtxDrv:1: error = 31933 is cleared kkzdQueryObjNumByName:------ORA-1403 data not found --- kkzdQueryObjNumByName:usrid= 104, oname=VW_LAT_9DCD9C42 kkzdQueryObjNumByName:---------------------------------
Im Forum gab es - wie üblich - ein paar gute Hinweise:
- Andrew Sayer lieferte den Vorschlag, einen optimizer_features_enable Hint zu ergänzen, um das Optimizer-Verhalten auf eine andere Version zu setzen (mit 11.1.0.7 funktioniert der refresh).
- Dontatello Settembrino merkte an, dass der refresh funktioniert, wenn man die Operation als SYS ausführt (was kein workaround ist, aber eine interessante Beobachtung).
- Mustafa Kalayci fand heraus, dass der Refresh in 12.2 funktioniert, wenn man ihn in eine skalare Subquery einbaut.