programing

Oracle 구체화 보기 오류: 코드 포함

telecom 2023. 8. 28. 20:49
반응형

Oracle 구체화 보기 오류: 코드 포함

Oracle 10g에서 다음 코드를 실행할 때:

drop materialized view test4;
drop materialized view test3;
drop table test2;
drop table test1;

create table test1
(
  x1 varchar2(1000),
  constraint test1_pk primary key (x1)
);

create materialized view log on test1 with sequence;

create table test2
(
  x2 varchar2(1000),
  constraint test2_pk primary key (x2)
);

create materialized view log on test2 with sequence;

create materialized view test3
refresh complete on demand 
as
(
  select x1 from test1
  union all
  select null from dual where 0 = 1
);

alter table test3 add constraint test3_pk primary key (x1);

create materialized view log on test3 with sequence;

create materialized view test4
refresh fast on commit
as
(
  select t1.rowid as rid1, t2.rowid as rid2, t1.x1 u1, t2.x2
  from test3 t1, test2 t2
  where t1.x1 = t2.x2
);

구체화된 뷰를 생성하려고 할 때 이 오류가 발생합니다.test4:

SQL Error: ORA-12053: this is not a valid nested materialized view  
12053. 00000 -  "this is not a valid nested materialized view"  
*Cause:    The list of objects in the FROM clause of the definition of this  
           materialized view had some dependencies upon each other.  
*Action:   Refer to the documentation to see which types of nesting are valid.

저는 "FROM 절"에 있는 어떤 개체도 어떻게 서로 의존하는지 이해할 수 없습니다.

이걸 어떻게 작동시키죠?현재 제가 생각할 수 있는 유일한 작업은 교체하는 것입니다.test3수동으로 데이터를 삭제하고 새로 고칩니다.이 접근법은 효과가 있지만, 약간 해킹처럼 보입니다.

또는 두 개의 테이블을 가지고 기본 테이블 중 하나는 대량 업데이트되지만(구체화된 보기에 반영될 필요가 없음) 다른 업데이트는 구체화된 보기(즉, "반")에 반영되어야 하는 예제를 보고 싶습니다.fast refresh on commit반반씩complete refresh on demand) 를 사용해 보았습니다.refresh force하지만 사용할 때는EXECUTE DBMS_MVIEW.EXPLAIN_MVIEW()커밋에서 패션 리프레시를 사용할 수 있다는 증거를 찾지 못했습니다.저는 이것도 함께 하고 싶습니다.union all마찬가지로

다음과 같이 test4 구체화된 보기를 빠르게 새로 고칠 수 있습니다.

SQL> create table test1
  2  ( x1 varchar2(1000)
  3  , constraint test1_pk primary key (x1)
  4  )
  5  /

Table created.

SQL> create materialized view log on test1 with rowid
  2  /

Materialized view log created.

SQL> create table test2
  2  ( x2 varchar2(1000)
  3  , constraint test2_pk primary key (x2)
  4  )
  5  /

Table created.

SQL> create materialized view log on test2 with rowid
  2  /

Materialized view log created.

SQL> create materialized view test4
  2  refresh fast on commit
  3  as
  4    select t1.rowid as rid1
  5         , t2.rowid as rid2
  6         , t1.x1 u1
  7         , t2.x2
  8      from test1 t1
  9         , test2 t2
 10     where t1.x1 = t2.x2
 11  /

Materialized view created.

SQL> insert into test1 values ('hello')
  2  /

1 row created.

SQL> insert into test2 values ('hello')
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from test4
  2  /

RID1               RID2
------------------ ------------------
U1
---------------------------------------------
X2
---------------------------------------------
AAATU5AAEAAAssfAAA AAATU8AAEAAAssvAAA
hello
hello


1 row selected.

중첩된 MV가 작동하려면 기본 MV가 될 수 없기 때문에 사례가 작동하지 않습니다. 처음에는 이상하게 들리지만 test3에서 했던 것과 같은 트릭이 있어야 작동합니다.또한 조인 MV가 작동하려면 기본 테이블의 구체화된 보기 로그를 ROWID로 만들어야 합니다.

빠르게 새로 고칠 수 있는 구체화된 보기 오류에 대해 제가 쓴 일련의 블로그 게시물을 보면 좋을 것입니다.여기에는 거의 모든 제한 사항이 설명되어 있습니다.

기본 MV
MV 가입
집계 MV
모든 MV 연합
중첩 MV
MV_Capabilities_테이블
요약

안부 전해요,


Added: 29-09-2011

다음은 test2에서도 union all trick을 사용하여 중첩된 MV의 예입니다.

SQL> create table test1
  2  ( x1 varchar2(1000)
  3  , constraint test1_pk primary key (x1)
  4  )
  5  /

Table created.

SQL> create materialized view log on test1 with rowid
  2  /

Materialized view log created.

SQL> create table test2
  2  ( x2 varchar2(1000)
  3  , constraint test2_pk primary key (x2)
  4  )
  5  /

Table created.

SQL> create materialized view log on test2 with rowid
  2  /

Materialized view log created.

SQL> create materialized view test2_mv
  2  refresh fast on commit
  3  as
  4  select rowid rid
  5       , x2
  6       , 'A' umarker
  7    from test2
  8   union all
  9  select rowid
 10       , x2
 11       , 'B'
 12    from test2
 13   where 1=0
 14  /

Materialized view created.

SQL> alter table test2_mv add constraint test2_mv_pk primary key(x2)
  2  /

Table altered.

SQL> create materialized view log on test2_mv with rowid
  2  /

Materialized view log created.

SQL> create materialized view test3
  2  refresh fast on commit
  3  as
  4  select rowid rid
  5       , x1
  6       , 'A' umarker
  7    from test1
  8   union all
  9  select rowid
 10       , x1
 11       , 'B'
 12    from test1
 13   where 0 = 1
 14  /

Materialized view created.

SQL> alter table test3 add constraint test3_pk primary key (x1)
  2  /

Table altered.

SQL> create materialized view log on test3 with rowid
  2  /

Materialized view log created.

SQL> create materialized view test4
  2  refresh fast on commit
  3  as
  4    select t1.rowid as rid1
  5         , t2.rowid as rid2
  6         , t1.x1 u1
  7         , t2.x2
  8      from test3 t1
  9         , test2_mv t2
 10     where t1.x1 = t2.x2
 11  /

Materialized view created.

SQL> insert into test1 values ('hello')
  2  /

1 row created.

SQL> insert into test2 values ('hello')
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from test4
  2  /

RID1               RID2
------------------ ------------------
U1
---------------------------------------------------
X2
---------------------------------------------------
AAATXbAAEAAAstdAAA AAATXXAAEAAAstNAAA
hello
hello


1 row selected.

이것이 도움이 되길 바랍니다!

오라클에서 인용

다중 계층 구체화 보기 사용에 대한 제한 사항

구체화된 마스터 뷰와 구체화된 뷰를 기반으로 하는 구체화된 뷰 모두 다음을 수행해야 합니다.

  • 주요 주요 구체화된 뷰가 됩니다.
  • 호환성 수준이 9.0.1 이상인 데이터베이스에 상주

참고: COMPATIBLE 초기화 매개변수는 데이터베이스의 호환성 수준을 제어합니다.

하지만, 저는 당신을 위한 해결책을 시도해 보겠습니다.돌아올 것이다.

업데이트: 성공하지 못해서 죄송합니다.당신은 제한이 너무 많습니다 :)

Oracle 설명서에 따르면 운이 없을 수 있습니다.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28313/basicmv.htm#i1006734

구체화된 뷰에 중첩된 구체화된 뷰를 작성할 수 있지만 모든 상위기본 구체화된 뷰에는 결합 또는 집합체가 포함되어야 합니다. 구체화된 보기에 대한 정의 쿼리에 조인 또는 집계가 포함되어 있지 않으면 중첩할 수 없습니다.구체화된 뷰가 정의된 모든 기본 객체(구체화된 뷰 또는 테이블)에는 구체화된 뷰 로그가 있어야 합니다.모든 기본 개체는 테이블인 것처럼 처리됩니다.또한 구체화된 뷰에 대해 기존의 모든 옵션을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7479485/oracle-materialized-view-error-code-included

반응형