복붙노트

[SQL] ORA-30926 : 테이블을 병합 할 때 소스 테이블의 행의 안정적인 세트를 얻을 수 없습니다

SQL

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

나는이 병합 문이 :

MERGE INTO TB_DP_REGIAO B
USING TMP_DP_REGIAO P
ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE)
WHEN MATCHED THEN UPDATE SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END,
                             B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DT_LOAD ELSE B.DT_LOAD END
WHEN NOT MATCHED THEN INSERT(B.DS_PROTHEUS_CODE, B.DS_PLANNING_CODE, B.DT_LOAD) VALUES(P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD);

그 날이 오류를 반환 :

Error starting at line 1 in command:
MERGE INTO TB_DP_REGIAO B
USING TMP_DP_REGIAO P
ON (P.DS_PROTHEUS_CODE = B.DS_PROTHEUS_CODE)
WHEN MATCHED THEN UPDATE SET B.DS_PLANNING_CODE = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DS_PLANNING_CODE ELSE B.DS_PLANNING_CODE END,
                             B.DT_LOAD = CASE WHEN B.DT_LOAD < P.DT_LOAD THEN P.DT_LOAD ELSE B.DT_LOAD END
WHEN NOT MATCHED THEN INSERT(B.DS_PROTHEUS_CODE, B.DS_PLANNING_CODE, B.DT_LOAD) VALUES(P.DS_PROTHEUS_CODE, P.DS_PLANNING_CODE, P.DT_LOAD)
Error report:
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.

목표 테이블이 비어있는 경우, 그것을 작동합니다. P.DT_LOAD가 B.DT_LOAD과 동일 할 때 나는 그것을 실행하면 작동합니다. 나는 다음 날을 실행하면 P.DT_LOAD는 하루 앞서있을 때,이 오류가 발생합니다.

이에 캔 누군가의 도움 나?

사전에 감사합니다!

해결법

  1. ==============================

    1.그것은 조금 까다로운 경우입니다. 가장 큰 이유는 대상 테이블을 여러 번 동일한 행을 갱신 TMP_DP_REGIAO.DS_PROTHEUS_CODE 열 병합 시도에 중복이 보인다는 것이다. 업데이트 된 열에서 새 값과 이전 값이 동일한 경우에, 오라클은 중복이 문제를 건너 뛸 수 있습니다 :

    그것은 조금 까다로운 경우입니다. 가장 큰 이유는 대상 테이블을 여러 번 동일한 행을 갱신 TMP_DP_REGIAO.DS_PROTHEUS_CODE 열 병합 시도에 중복이 보인다는 것이다. 업데이트 된 열에서 새 값과 이전 값이 동일한 경우에, 오라클은 중복이 문제를 건너 뛸 수 있습니다 :

    SQL> select * from t;
    
          CODE TEXT                                                                 
    ---------- ----------                                                           
             1 test                                                                 
    
    SQL> merge into t using (
      2   select 1 code,'test' text from dual union all
      3   select 1 code,'test' text from dual
      4  ) s
      5  on (t.code = s.code)
      6  when matched then
      7    update set t.text = s.text
      8  /
    
    2 rows merged 
    

    이전 및 새 값이 다른 경우 그러나 오라클은 당신이 얻을 예외를 제기한다 :

    SQL> merge into t using (
      2   select 1 code,'a' text from dual union all
      3   select 1 code,'a' text from dual
      4  ) s
      5  on (t.code = s.code)
      6  when matched then
      7    update set t.text = s.text
      8  /
    merge into t using (
               *
    error in line 1:
    ORA-30926: unable to get a stable set of rows in the source tables 
    
  2. ==============================

    2.이 문제에 대한 또 다른 이유는 ON 절에 지정된 조건이 될 수 있습니다. 두 가지 이유 때문일 수 있습니다 각각의 소스 행 대 목적지 행에 많은 매핑 1있을 때이 오류가 발생합니다.

    이 문제에 대한 또 다른 이유는 ON 절에 지정된 조건이 될 수 있습니다. 두 가지 이유 때문일 수 있습니다 각각의 소스 행 대 목적지 행에 많은 매핑 1있을 때이 오류가 발생합니다.

    1) there are duplicate rows in source table.
    2) there are unique rows in source table, but ON clause conditions are pointing to multiple rows in the source table.
    

    두 번째 경우에 ON 절 조건은 각각 1 소스 및 목적지 테이블에 맵핑 한 다수의 1로 또는 달성하기 위해 수정되었다.

  3. from https://stackoverflow.com/questions/21935340/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables-when-merging by cc-by-sa and MIT license