0

実際のアプリデータのコピーに対して正常に実行されるマテリアライズドビューをいくつか作成しました。アプリは独自のデータを監視しません。それ以来、一部のユーザーは、データ入力に不注意または創造的であった可能性があります。Mviewはチョークして死にます。エラーメッセージは、1つ以上の関数から複数の行が返されることを示しています。

EXCEPTIONSを使用しようとしていますが、DBMS_Outputで最初の行object_idが成功し、関数(の1つ)が失敗します。MViewの実行を完了し、各関数から問題を引き起こすobject_idsをログに記録できる方がよいでしょう。例外データをテーブルに挿入することに成功していません。

プラットフォームはOracle10g2です。DMLエラーログインを頭に詰め込もうとしています。これはBULKデータで機能するはずであると理解しており、マテリアライズドビューを作成することは適切であると想定しています。これはMViewsで機能しますか?これが最善の方法ですか?

4

1 に答える 1

1

マテリアライズド・ビューをリフレッシュしようとしているだけの場合、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
于 2011-09-13T18:57:29.650 に答える