[SQL] 오라클 SQL : 다른 삽입 존재 업데이트하는 경우 [중복]
SQL오라클 SQL : 다른 삽입 존재 업데이트하는 경우 [중복]
안녕,
나는 이미 새로운 레코드를 삽입해야하는 다른 존재하는 경우 레코드가 수정되어야하는 테이블이 있습니다. - 업데이트 - 다른 - 삽입 쿼리 오라클은 SQL 나던 그렇지 않으면 내가 만약을했을 것, IF가 존재 동의합니다. 나는 MERGE 검토 한하지만 그것은 단지 여러 테이블에 적용됩니다. 어떻게해야합니까?
해결법
-
==============================
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.
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.당신은 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.난 항상 그것을 할 방법은 (만 삽입, 삭제되지 않겠다고되는 데이터를 가정)이다
난 항상 그것을 할 방법은 (만 삽입, 삭제되지 않겠다고되는 데이터를 가정)이다
항상 쉬운 일이 아닙니다, 그래서 같은 최대 절전 모드와 같은 불행하게도 많은 프레임 워크는 복구 할 수없는 상태로 모든 데이터베이스 오류 (예를 들어, 고유 제한 조건 위반)를 취급합니다. (최대 절전 모드에서의 해결책은 명령 삽입이 일을 실행하기 위해 새로운 세션 / 트랜잭션을 열 수 있습니다.)
당신은 단지 선택 카운트를 할 수 없다 (*) .. 어디 .. 그 반환 제로, 따라서 당신은 당신이 선택하고 다른 삽입 누군가가 행을 삽입 한 수를 할 시간 사이에 삽입 할 것인지를 선택 같은 경우에도 따라서 귀하의 삽입이 실패합니다.
-
==============================
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.당신이 오라클에 UPSERT / MERGE 명령을 사용하려면이 질문을 참조하십시오. 그렇지 않으면, 단지 첫째 카운트 (1)하고 다음 삽입 또는 업데이트 여부를 결정하여 클라이언트 측에서 문제를 해결.
당신이 오라클에 UPSERT / MERGE 명령을 사용하려면이 질문을 참조하십시오. 그렇지 않으면, 단지 첫째 카운트 (1)하고 다음 삽입 또는 업데이트 여부를 결정하여 클라이언트 측에서 문제를 해결.
from https://stackoverflow.com/questions/4015199/oracle-sql-update-if-exists-else-insert by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 루프없이 SQL 날짜에 영업일 추가 (0) | 2020.06.06 |
---|---|
[SQL] WHERE NULL이 절은 SQL Server 매개 변수 값에 따라 NULL 또는 NO가 없습니다 (0) | 2020.06.06 |
[SQL] SQL에서 두 행을 병합 (0) | 2020.06.05 |
[SQL] 연결 풀링을 사용하는 동안 방법, 물리적으로 가까이에도록 SqlConnection을 강제로? (0) | 2020.06.05 |
[SQL] 자바 JDBC 연결 상태 (0) | 2020.06.05 |