IT박스

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

itboxs 2020. 7. 18. 22:49
반응형

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

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


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

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


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- 하위 쿼리'에서 병합 불가능한 뷰가 포함되어 있습니까? 쿼리에 "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에서 체인 행 모니터링


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

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

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

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


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)로 인해이 오류가 발생했습니다.

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

but again when I tried merge without unique same proble occurred Second time it was due to commit

after merge if commit is not done same Error will be shown.

Without unique, Query will work if commit is given after each merge operation.


A further clarification to the use of DISTINCT to resolve error ORA-30926 in the general case:

You need to ensure that the set of data specified by the USING() clause has no duplicate values of the join columns, i.e. the columns in the ON() clause.

In OP's example where the USING clause only selects a key, it was sufficient to add DISTINCT to the USING clause. However, in the general case the USING clause may select a combination of key columns to match on and attribute columns to be used in the UPDATE ... SET clause. Therefore in the general case, adding DISTINCT to the USING clause will still allow different update rows for the same keys, in which case you will still get the ORA-30926 error.

This is an elaboration of DCookie's answer and point 3.1 in Tagar's answer, which from my experience may not be immediately obvious.

참고URL : https://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables

반응형