복붙노트

[SQL] 오라클 SQL : 다른 삽입 존재 업데이트하는 경우 [중복]

SQL

오라클 SQL : 다른 삽입 존재 업데이트하는 경우 [중복]

안녕,

나는 이미 새로운 레코드를 삽입해야하는 다른 존재하는 경우 레코드가 수정되어야하는 테이블이 있습니다. - 업데이트 - 다른 - 삽입 쿼리 오라클은 SQL 나던 그렇지 않으면 내가 만약을했을 것, IF가 존재 동의합니다. 나는 MERGE 검토 한하지만 그것은 단지 여러 테이블에 적용됩니다. 어떻게해야합니까?

해결법

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

    1.MERGE는 "여러 테이블"을 필요로하지 않지만, 소스로 질의를 필요로 않습니다. 이런 식으로 뭔가 작업을해야합니다 :

    MERGE는 "여러 테이블"을 필요로하지 않지만, 소스로 질의를 필요로 않습니다. 이런 식으로 뭔가 작업을해야합니다 :

    MERGE INTO mytable d
    USING (SELECT 1 id, 'x' name from dual) s
    ON (d.id = s.id)
    WHEN MATCHED THEN UPDATE SET d.name = s.name
    WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name);
    

    또는 당신은 PL / SQL에서이 작업을 수행 할 수 있습니다 :

    BEGIN
      INSERT INTO mytable (id, name) VALUES (1, 'x');
    EXCEPTION
      WHEN DUP_VAL_ON_INDEX THEN
        UPDATE mytable
        SET    name = 'x'
        WHERE id = 1;
    END;
    
  2. ==============================

    2.

    merge into MY_TABLE tgt
    using (select [expressions]
             from dual ) src
       on (src.key_condition = tgt.key_condition)
    when matched then 
         update tgt
            set tgt.column1 = src.column1 [,...]
    when not matched then 
         insert into tgt
            ([list of columns])
         values
            (src.column1 [,...]);
    
  3. ==============================

    3.당신은 SQL의 % ROWCOUNT 오라클 변수를 사용할 수 있습니다 :

    당신은 SQL의 % ROWCOUNT 오라클 변수를 사용할 수 있습니다 :

    UPDATE table1
      SET field2 = value2, 
          field3 = value3 
    WHERE field1 = value1; 
    
    IF (SQL%ROWCOUNT = 0) THEN 
    
      INSERT INTO table (field1, field2, field3)
      VALUES (value1, value2, value3);
    
    END IF; 
    

    당신의 기본 키 (즉, 필드 1)의 값을 갖는 경우 단지 결정하기 쉽게하고 그에 따라 삽입 또는 업데이트를 수행 할 것입니다. 저장 프로 시저에 대한 매개 변수로 말했다 값을 사용하는 경우 즉,이다.

  4. ==============================

    4.난 항상 그것을 할 방법은 (만 삽입, 삭제되지 않겠다고되는 데이터를 가정)이다

    난 항상 그것을 할 방법은 (만 삽입, 삭제되지 않겠다고되는 데이터를 가정)이다

    항상 쉬운 일이 아닙니다, 그래서 같은 최대 절전 모드와 같은 불행하게도 많은 프레임 워크는 복구 할 수없는 상태로 모든 데이터베이스 오류 (예를 들어, 고유 제한 조건 위반)를 취급합니다. (최대 절전 모드에서의 해결책은 명령 삽입이 일을 실행하기 위해 새로운 세션 / 트랜잭션을 열 수 있습니다.)

    당신은 단지 선택 카운트를 할 수 없다 (*) .. 어디 .. 그 반환 제로, 따라서 당신은 당신이 선택하고 다른 삽입 누군가가 행을 삽입 한 수를 할 시간 사이에 삽입 할 것인지를 선택 같은 경우에도 따라서 귀하의 삽입이 실패합니다.

  5. ==============================

    5.HC-방법 :

    HC-방법 :

    DECLARE
      rt_mytable mytable%ROWTYPE;
      CURSOR update_mytable_cursor(p_rt_mytable IN mytable%ROWTYPE) IS
      SELECT *
      FROM   mytable
      WHERE  ID = p_rt_mytable.ID
      FOR UPDATE;
    BEGIN
      rt_mytable.ID   := 1;
      rt_mytable.NAME := 'x';
      INSERT INTO mytable VALUES (rt_mytable);
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
      <<update_mytable>>
      FOR i IN update_mytable_cursor(rt_mytable) LOOP
        UPDATE mytable SET    
          NAME = p_rt_mytable.NAME
        WHERE CURRENT OF update_mytable_cursor;
      END LOOP update_mytable;
    END;
    
  6. ==============================

    6.당신이 오라클에 UPSERT / MERGE 명령을 사용하려면이 질문을 참조하십시오. 그렇지 않으면, 단지 첫째 카운트 (1)하고 다음 삽입 또는 업데이트 여부를 결정하여 클라이언트 측에서 문제를 해결.

    당신이 오라클에 UPSERT / MERGE 명령을 사용하려면이 질문을 참조하십시오. 그렇지 않으면, 단지 첫째 카운트 (1)하고 다음 삽입 또는 업데이트 여부를 결정하여 클라이언트 측에서 문제를 해결.

  7. from https://stackoverflow.com/questions/4015199/oracle-sql-update-if-exists-else-insert by cc-by-sa and MIT license