2011-09-13 53 views
0

実際のアプリデータのコピーに対して正常に動作するいくつかのマテリアライズドビューを作成しました。アプリは自分のデータを警戒しません。それ以来、ユーザーの中には、データ入力時に不注意であったり、創造的であったりするものもあります。 Mviewは今やチョークして死ぬ。エラーメッセージは、1つまたは複数の関数から複数の行が返されていることを示しています。Oracleマテリアライズド・ビューでエラーの原因となるデータをログに記録する方法はありますか?

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

プラットフォームはOracle 10g2です。私は自分の頭にDML Error Loggingを詰め込もうとしていました。私はこれがBULKデータではうまくいくはずであることを理解しています。マテリアライズドビューを作成することが適格であると仮定しています。 MViewsでこの作業をしようとしていますか?これが最善の方法ですか?

答えて

1

マテリアライズド・ビューをリフレッシュしようとしているだけであれば、DMLエラー・ロギングを使用してすべての問題行を取り込む方法がわかりません。一方、マテリアライズド・ビューをリフレッシュする際に発生するすべてのエラーをキャプチャするために表を移入すると、表を作成してDMLエラー・ロギングを使用できます。

このテーブルに手動でデータを入力してから、create a materialized view on this prebuilt tableを入力します。マテリアライズド・ビューの使用方法とクエリー・リライトの種類によって、問題の原因となる可能性があります。作成した表には、基礎となる表のデータ(エラー・ログに書き込まれた行)が欠落している可能性があります。

テーブルとエラーログ

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行を挿入してください。図3は、LEVELは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 
+0

あなたはそれが私よりもはるかに優れていると言っています... FCNが複数の行を返すため、MViewはリフレッシュに失敗しています。これは、メインクエリからobject_IDを取得し、シード行のerrテーブルを使用してfcn出力を列としてクエリを実行するのに役立ちます。いずれにせよ、潜在的に何百万行もの行から、私たちが知ることができない原因となる1,000行になる可能性があります。私たちはそれを試してみましょう、私たちが成功すれば私は報告します。感謝ジャスティン – Marc

+0

私はついに戻ってきました...私たちはMViewのエラーを記録するコードを実装しました。できます。私は、事前に構築されたテーブルからMViewを構築する方法については理解していませんでした。ハーーマントの記事は役に立たなかったが、それは遅れている。私はそれについて勉強しなければならないでしょう、私はすぐにそれが必要になると確信しています。 ;) – Marc

関連する問題