2010-02-25 7 views
94

소스 테이블의 행의 안정적인 세트를 얻을 수 없습니다ORA-30926 : 나는 점점 오전

ORA-30926 : 소스 테이블의 행의 안정적인 세트를 얻을 수 없습니다

다음 쿼리 :

MERGE INTO table_1 a 
     USING 
     (SELECT a.ROWID row_id, 'Y' 
       FROM table_1 a ,table_2 b ,table_3 c 
       WHERE a.mbr = c.mbr 
       AND b.head = c.head 
       AND b.type_of_action <> '6') src 
       ON (a.ROWID = src.row_id) 
    WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 

나는 데이터가 table_1를 실행 한도 또한 데이터가 내부 쿼리 (src)를 실행했습니다.

왜이 오류가 발생하고 어떻게 해결할 수 있습니까?

답변

145

이것은 일반적으로 USING 절에 지정된 쿼리에서 중복으로 인해 발생합니다. 이것은 아마도 TABLE_A가 상위 테이블이며 같은 ROWID가 여러 번 리턴된다는 것을 의미합니다.

쿼리에서 DISTINCT를 사용하여 신속하게 문제를 해결할 수 있습니다. 실제로 'Y'는 상수 값이므로 쿼리에 넣지 않아도됩니다.

쿼리에이 같은 것을 할 수있는 (테이블을 모르는) 올바른 가정 :

MERGE INTO table_1 a 
     USING 
     (SELECT distinct ta.ROWID row_id 
       FROM table_1 a ,table_2 b ,table_3 c 
       WHERE a.mbr = c.mbr 
       AND b.head = c.head 
       AND b.type_of_action <> '6') src 
       ON (a.ROWID = src.row_id) 
    WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 
+0

10x 좋은 답변입니다. 그것은 나를 도왔습니다 –

+0

저도 .. 머리에 바로 – TonyP

+1

이것은 아마도 다른 접근법 (나를 위해)도 나를 위해 다른 오류 (프로 시저, 함수, 패키지 또는 유형이 허용되지 않습니다 '및'수정할 수 없습니다. 보기에 삽입하려고 시도하는 동안 키가 아닌 테이블 오류로 매핑되는 열 '). ~ 다른 사람들에게 도움이된다면 내부 쿼리의 조인을 다시 배열하기 전까지 동일한 오류가 발생합니다. 그래서 하나 이상의 행이 반환되고 내부가 조인 된 테이블로 시작했습니다 ... 그 말이 맞는다면. – jinglesthula

33

아마도 대상 테이블의 동일한 행을 여러 번 업데이트하려고 할 것입니다. 방금 개발 한 병합 성명서에서 똑같은 문제가 발생했습니다. 병합 실행시 업데이트가 동일한 레코드를 두 번 이상 만지지 않도록하십시오.

+0

+1 덕분에, 이것은 단지 적은 수의 중복 (적어도 병합에 사용 된 키를 기반으로)이있는 대상 테이블에서 나에게 일어났습니다. – tbone

2

방법 ORA-30926 오류 문제를 해결하기를? (문서의 ID 471956.1)

1) 식별 실패한 문

ALTER 세션 설정 이벤트 '30926 추적 이름 errorstack 레벨 3';

또는

ALTER 시스템 이벤트 '30926 추적 이름은 오프 errorstack'설정;

.trc 파일이있을 경우 UDUMP에서 감시합니다.

2) SQL 문을 찾았 으면 올바른지 (아마도 explain plan 또는 tkprof를 사용하여 쿼리 실행 계획을 확인하십시오) 최근에 수행되지 않은 경우 해당 테이블에 대한 통계를 분석하거나 계산하십시오. 인덱스를 다시 작성 (또는 삭제/다시 작성)하면 도움이 될 수 있습니다.

3.1) SQL 문은 MERGE입니까? USING 절이 리턴 한 데이터를 평가하여 조인에 중복 값이 ​​없는지 확인하십시오. 결정적 where 절을 포함하도록 병합 문을 수정하십시오.

3.2 뷰를 통해 UPDATE 문입니까? 그렇다면 뷰 결과를 테이블에 채우고 테이블을 직접 업데이트 해보십시오.

3.3) 테이블에 트리거가 있습니까? 이를 사용 불가능으로 설정하여 여전히 실패하는지 확인하십시오.

3.4) 'IN-Subquery'에 병합 불가 뷰가 포함되어 있습니까? 쿼리에 "FOR UPDATE"절이 있으면 중복 행이 반환 될 수 있습니다. 버그 2681037 참조

3.5) 테이블에 사용하지 않는 열이 있습니까? 이것들을 없애면 오류를 예방할 수 있습니다.

4) SQL을 수정해도 오류가 해결되지 않으면 특히 행이 체인 된 경우 테이블에 문제가있을 수 있습니다. 4.1) SQL에 사용 된 모든 테이블에 대해 'ANALYZE TABLE VALIDATE STRUCTURE CASCADE'문을 실행하여 테이블이나 인덱스에 손상이 있는지 확인하십시오. 4.2) 테이블에서 CHAINED 또는 마이그레이션 된 ROWS를 확인하고 제거하십시오. PCTFREE의 올바른 설정과 같이이를 최소화하는 방법이 있습니다. 사용 주 122020.1 - 테이블이 추가로 인덱스 구성되어있는 경우 행 체인 및 마이그레이션 4.3)을 참조하십시오 주 102932.1 - 12C와 맞게 기존 답변 없음 오늘에 이었지만

3

에 오류를 체인화 된 행 더라면 모니터링 (중복이 없으며 WHERE 절에 비 결정적 표현식이 없음).

ORA-30926 : A : 소스 테이블
원인의 행 안정적인 세트를 얻을 수 없습니다 내 경우는 오라클의 메시지 텍스트 (아래의 강조)에 따라, 오류의 다른 원인에 관계가 있었다 큰 dml 활동 또는 비 결정적 WHERE 절로 인해 안정된 행 집합에 을 가져올 수 없습니다.

병합은 더 큰 배치의 일부이며 많은 동시 사용자가있는 실제 데이터베이스에서 실행되었습니다. 성명을 변경할 필요가 없었습니다. 병합 전에 트랜잭션을 커밋 한 다음 병합을 별도로 실행하고 다시 커밋했습니다. 그래서 해결책은 메시지의 제안 활동에서 발견되었다 :

조치 : 비 결정적 절을 제거하고 DML을 다시 .

+0

통계 수집 단계에서 네트워크를 통해 DataPump 가져 오기 (원본 데이터베이스에 직접 연결되는 'NETWORK_LINK'매개 변수 사용)를 통해 오류 메시지가 표시되고 강조 표시된 메모에서이를 설명 할 수 있습니다. 다행스럽게도 통계 만 영향을 받았습니다. –