ORA-30926 : 소스 테이블에 안정적인 행 세트를 취득 할 수 없습니다


129

나는 얻고있다

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또한 데이터가).

이 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

답변:


202

이는 일반적으로 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';

1
이것은 아마도 다른 접근법 (나를 위해)이 나에게 다른 오류를 반환 한 이유입니다 (예 : '프로 시저, 함수, 패키지 또는 유형은 여기에서 허용되지 않습니다') 및 '키 보존되지 않은 테이블 오류에 매핑되는 열을 수정할 수 없습니다. 뷰에 삽입하십시오 '). ~ 다른 사람에게 도움이된다면 내부 쿼리의 조인을 다시 정렬 할 때까지 구별을 추가 한 후에도 동일한 오류가 발생하여 하나 이상의 행이 반환되고 내부에서 조인 된 테이블로 시작했습니다 ... 말이된다.
jinglesthula 2016

40

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


1
+1, 감사합니다. 이것은 적은 수의 복제본이있는 대상 테이블에서 발생했습니다 (적어도 병합에 사용 된 키를 기반으로 함).
tbone

6

ORA-30926 오류 해결 방법 (문서 ID 471956.1)

1) 실패한 진술을 식별

세션 세트 이벤트 변경 '30926 추적 이름 오류 스택 레벨 3';

또는

시스템 세트 이벤트 변경 '30926 추적 이름 errorstack off';

UDUMP에서 .trc 파일이 있는지 확인하십시오.

2) SQL 문을 찾은 경우, 명령문이 올바른지 확인하고 (아마도 Explain Plan 또는 tkprof를 사용하여 조회 실행 계획을 점검) 최근에 수행되지 않은 경우 관련 테이블에서 통계를 분석하거나 계산하십시오. 인덱스를 다시 작성 (또는 삭제 / 다시 작성)해도 도움이 될 수 있습니다.

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

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-IOT에서 체인 행 모니터링


5

오늘 12c에서 오류가 있었으며 기존 답변에 적합하지 않았습니다 (WHERE 절에 중복되지 않고 비 결정적 표현이 없음). 필자의 사례는 Oracle의 메시지 텍스트 (아래 강조)에 따라 다른 가능한 오류 원인과 관련이 있습니다.

ORA-30926 : 소스 테이블에 안정적인 행 세트를 취득 할 수 없습니다
원인 : 큰 dml 활동 이나 비 결정적인 where 절에 의해 안정적인 행 세트를 취득 할 수 없었습니다 .

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

조치 : 비 결정적 where 절을 제거 하고 dml을 다시 발행하십시오 .


NETWORK_LINK통계 수집 단계에서 네트워크를 통해 DataPump 가져 오기를 수행하는 오류 메시지 ( 소스 데이터베이스에 직접 연결되는 매개 변수 사용 )를 수신했으며 강조 표시된 메모에 설명되어 있습니다. 다행히도 통계 만 영향을 받았습니다.
마크 스튜어트

1
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

중복 된 레코드 (16K)로 인해이 오류가 발생했습니다.

나는 그것이 일한 독특한 시도했다 .

그러나 다시 같은 똑같은 문제없이 병합을 시도했을 때 커밋으로 인한 것입니다.

커밋이 완료되지 않은 경우 병합 후 동일한 오류가 표시됩니다.

고유하지 않으면 각 병합 작업 후에 커밋이 제공되면 쿼리가 작동합니다.


-1

일반적인 경우 오류 ORA-30926을 해결하기 위해 DISTINCT를 사용하는 것에 대한 추가 설명 :

USING () 절에 지정된 데이터 세트에 결합 열의 중복 값 , 즉 ON () 절의 열 이 없는지 확인해야합니다 .

USING 절이 키만 선택하는 OP의 예에서는 DISTINCT를 USING 절에 추가하는 것으로 충분했습니다. 그러나 일반적인 경우 USING 절은 UPDATE ... SET 절에서 사용할 키 컬럼과 속성 컬럼의 조합을 선택할 수 있습니다. 따라서 일반적인 경우, USING 절에 DISTINCT를 추가하면 동일한 키에 대해 다른 업데이트 행을 계속 사용할 수 있으며이 경우 여전히 ORA-30926 오류가 발생합니다.

이것은 DCookie의 답변과 Tagar의 답변에서 3.1을 정교화 한 것으로 내 경험으로는 즉각적으로 명확하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.