2011-09-13 3 views
0

우리는 실제 앱 데이터의 사본과 잘 어울리는 구체화 된보기를 만들었습니다. 앱에서 자체 데이터를 확인하지 않습니다. 그 이후로 일부 사용자는 데이터 입력시 부주의하거나 창의적이었을 수 있습니다. Mview는 지금 질식하고 죽는다. 오류 메시지는 하나 이상의 함수에서 여러 행이 반환되었음을 나타냅니다.Oracle Materialized View에서 오류를 일으키는 데이터를 기록하는 방법은 무엇입니까?

우리는 EXCEPTIONS를 사용하려고했습니다. 첫 번째 행의 object_id에 대해 DBMS_Output에서 성공하여 일부 기능이 실패하게되었습니다. MView에 대한 실행을 완료하고 각 기능에서 문제를 일으키는 object_ids를 기록하는 것이 더 나을 것입니다. 예외 데이터를 테이블에 삽입하는 데 성공하지 못했습니다.

플랫폼은 Oracle 10g2입니다. 내 머리에 DML 오류 로깅을 과장하려고 노력했습니다. 나는 이것이 BULK 데이터를 위해 작동해야한다는 것을 이해하며, 구체화 된 뷰를 만드는 것이 자격이 있다고 가정하고 있습니다. MViews에서이 작업을 하시겠습니까? 이것이 최선의 방법입니까?

답변

1

구체화 된보기를 새로 고치려고하는 경우 DML 오류 로깅을 사용하여 모든 문제 행을 캡처하는 방법을 알지 못합니다. 반면에 테이블을 생성하고 DML 오류 로깅을 사용하면 테이블을 채우고 구체화 된 뷰를 새로 고칠 때 발생할 수있는 모든 오류를 캡처 할 수 있습니다.

잠재적으로이 테이블을 수동으로 채우고 create a materialized view on this prebuilt table을 채울 수 있습니다. 이는 작성한 테이블에 기본 테이블 (오류 로그에 기록 된 행)의 일부 데이터가 누락 될 것이므로 구체화 된 뷰가 사용되는 방식과 쿼리 재 작성의 종류에 따라 문제가 발생할 수 있습니다.

테이블 및 오류 로그 (10) 행을 삽입하는

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. 

시도를 만듭니다. 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를 작성하는 것에 대한 부분을 이해하지 못했습니다. Hermant의 기사는 도움이되지 않았지만 늦었습니다. 나는 그것에 대해 공부해야 할 것이고, 나는 곧 그것을 필요로 할 것이라고 확신한다. ;) – Marc