[SQL] ORA-30926 : 테이블을 병합 할 때 소스 테이블의 행의 안정적인 세트를 얻을 수 없습니다
SQLORA-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.그것은 조금 까다로운 경우입니다. 가장 큰 이유는 대상 테이블을 여러 번 동일한 행을 갱신 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.이 문제에 대한 또 다른 이유는 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로 또는 달성하기 위해 수정되었다.
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
'SQL' 카테고리의 다른 글
[SQL] 지금 () 함수로부터 시간 빼기 (0) | 2020.07.08 |
---|---|
[SQL] INT (10) 및 INT (12) 사이에 (내 코드에 적용되는 경우)의 차이점은 무엇입니까? (0) | 2020.07.08 |
[SQL] SQL 서버 2008 : 중간 위치 변경 데이터 형식에 새 열을 삽입 할 수 없습니다 (0) | 2020.07.08 |
[SQL] 독특한 날짜 범위에 대한 포스트 그레스 제약 (0) | 2020.07.08 |
[SQL] SQL 서버에서 한 달에 한 행으로 분할 날짜 범위 (0) | 2020.07.08 |