マテリアライズド・ビューをリフレッシュしようとしているだけの場合、DMLエラー・ロギングを使用してすべての問題のある行をキャプチャーする方法がわかりません。一方、表を作成し、表にデータを取り込むときにDMLエラー・ロギングを使用して、マテリアライズド・ビューのリフレッシュで発生するすべてのエラーをキャプチャーすることができます。
場合によっては、このテーブルに手動でデータを入力してから、この事前作成されたテーブルにマテリアライズド・ビューを作成することができます。これにより、マテリアライズドビューがどのように使用されているか、および作成したテーブルで基になるテーブル(エラーログに書き込まれた行)のデータの一部が失われるため、どのような種類のクエリリライトが有効になっているかによって問題が発生する可能性があります。
テーブルとエラーログを作成します
SQL> create table t (
2 col1 number,
3 col2 number
4 );
Table created.
Elapsed: 00:00:00.00
SQL> ed
Wrote file afiedt.buf
1 begin
2 dbms_errlog.create_error_log( 'T', 'T_ERR' );
3* end;
SQL> /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01
SQL> create function f1
2 return varchar2
3 is
4 begin
5 return 'A';
6 end;
7 /
Function created.
10行挿入してみてください。LEVEL
は3の倍数になり、関数によって返される文字列を数値に変換できないため、3は失敗します。
Elapsed: 00:00:00.01
SQL> insert into t( col1, col2 )
2 select level,
3 (case when mod(level,3) = 0
4 then to_number( f1 )
5 else mod(level,3)
6 end)
7 from dual
8 connect by level <= 10
9 log errors into t_err
10 reject limit unlimited;
7 rows created.
Elapsed: 00:00:00.01
SQL> ed
Wrote file afiedt.buf
1 select ora_err_mesg$, col1, col2
2* from t_err
SQL> /
ORA_ERR_MESG$ COL1 COL2
------------------------------ ---------- ----------
ORA-01722: invalid number 3 0
ORA-01722: invalid number 6 0
ORA-01722: invalid number 9 0
Elapsed: 00:00:00.00
次に、この事前作成されたテーブルを使用して、マテリアライズド・ビューを作成します
SQL> ed
Wrote file afiedt.buf
1 create materialized view t
2 on prebuilt table
3 as
4 select 1 col1, 1 col2
5* from dual
SQL> /
Materialized view created.
Elapsed: 00:00:00.11