2012-02-14 5 views
0

그래서 pp_terminal 테이블의 uemte_id 열에서 mm_chip 테이블의 uemte_id 열 (시작시 null)로 값을 복사하기 위해 대량 업데이트를 시도했습니다. 이 두 테이블은 common.This에는 열이 나는 무엇을 사용하지 있습니다한 테이블에서 다른 테이블로 일괄 업데이트

declare 
    type ue_tab is table of 
      pp_terminal.uemte_id%type; 

ue_name ue_tab; 
    cursor c1 is select uemte_id from pp_terminal; 

begin 
open c1; 
fetch c1 bulk collect into ue_name; 
close c1; 
-- bulk insert 
forall indx in ue_name.first..ue_name.last 
    update mm_chip set uemte_id = ue_name(indx); 

end; 
/

그리고 이것은 내가 오류 메시지입니다 :

Error report: 
ORA-00001: unique constraint (DPOWNERA.IX_AK7_MM_CHIP) violated 
ORA-06512: at line 13 
00001. 00000 - "unique constraint (%s.%s) violated" 
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key. 
      For Trusted Oracle configured in DBMS MAC mode, you may see 
      this message if a duplicate entry exists at a different level. 
*Action: Either remove the unique restriction or do not insert the key. 

당신이 명백한 misstakes를 볼 수 있나요?

+0

예, 'mm_chip'을 (를) 업데이트 할 때 고유 제한 조건을 위반합니다. 'uemte_id'를 포함하는 제약 조건이 있다고 가정하고 있습니까? – Ben

+0

예, 그렇습니다.하지만 pp_terminal의 모든 uemte_ids가 고유하고 mm_chip의 uemte_ids가 null이기 때문에 어떻게 해독했는지 알지 못합니다. – Baklavaman

+0

Jim Hudson이 방금 여러분에게 좋은 설명을 주셨습니다. 추가로 PL/SQL 블록에서 커서를 커밋하거나 닫지 마십시오. 이것은 복사 및 붙여 넣기 문제 일 수도 있지만 그렇지 않은 경우 두 가지 작업을 수행하는 것이 좋습니다. – Ben

답변

3

당신이 할하려는 것은 :

  • 그 값
  • 와 두 번째 테이블의 모든 행은 첫 번째 테이블
  • 에서 다른 행을 선택하려면 첫 번째 테이블에서
  • 업데이 트를 행을 선택
  • 업데이트는 상기 제 2 값 테이블의 모든 행
  • 및 등등 루프
,536을 완료 할 때까지

나는 그것이 당신이 정말로하고 싶은 것이 아니라고 생각합니다. 고유 한 제한 조건이 있으므로 두 번째 테이블에 동일한 값으로 여러 행을 가질 수 없으므로 실패합니다.

+0

나는 당신의 대답을 짐으로 보지 못했습니다. - 첫 번째 테이블에서 한 행 선택 - 두 번째 테이블에서 그 값을 가진 행을 업데이트하십시오. - 첫 번째 테이블에서 다른 행을 선택하십시오. - 두 번째 테이블에서 다른 행을 업데이트하십시오. 해당 값이있는 테이블 - 루프가 완료 될 때까지 또는 가능한 경우 : 첫 번째 테이블의 모든 행을 선택하고 두 번째 테이블의 모든 행을 해당 값으로 업데이트하십시오. – Baklavaman

0

다음은 두 번째 테이블의 행을 다시 사용하지 않고 두 번째 테이블의 임의 행의 값을 기반으로 한 테이블의 각 행을 업데이트하는 한 가지 방법입니다. SQL로 완전히 할 수 있다면 더 잘 수행 될 것이지만, 그렇게 할 수있는 방법을 찾지 못했습니다.

CREATE TABLE test4 AS 
    (SELECT  LEVEL AS cola, CAST(NULL AS number) AS colb 
    FROM  DUAL 
    CONNECT BY LEVEL <= 100); 

CREATE TABLE test5 AS 
    (SELECT  100 + LEVEL AS colc 
    FROM  DUAL 
    CONNECT BY LEVEL <= 99); 

DECLARE 
    CURSOR cur_test4 IS 
     SELECT  * 
     FROM  test4 
     FOR UPDATE ; 
    CURSOR cur_test5 IS 
     SELECT * FROM test5; 
    r_test5 cur_test5%ROWTYPE; 
BEGIN 
    OPEN cur_test5; 

    FOR r_test4 IN cur_test4 LOOP 
     FETCH cur_test5 INTO r_test5; 

     IF cur_test5%NOTFOUND THEN 
     EXIT; 
     END IF; 

     UPDATE test4 
     SET colb = r_test5.colc 
     WHERE CURRENT OF cur_test4; 
    END LOOP; 

    CLOSE cur_test5; 
END; 
+0

제 목적으로 잘 작동합니다. 감사합니다! (그래서, 업데이트하고있는 테이블에 커서가 없습니다.) – Baklavaman

관련 문제