반응형
Oracle 상수를 단일 테이블로 병합
오라클의 경우 단순 데이터 테이블이 주어지면 다음과 같습니다.
create table data (
id VARCHAR2(255),
key VARCHAR2(255),
value VARCHAR2(511));
값을 "삽입 또는 업데이트"한다고 가정합니다.다음과 같은 것이 있습니다.
merge into data using dual on
(id='someid' and key='testKey')
when matched then
update set value = 'someValue'
when not matched then
insert (id, key, value) values ('someid', 'testKey', 'someValue');
이것보다 더 좋은 방법이 있습니까?이 명령에는 다음과 같은 단점이 있습니다.
- 모든 리터럴은 두 번 입력해야 합니다(또는 매개 변수 설정을 통해 두 번 추가).
- "듀얼 사용" 구문은 진부해 보입니다.
이것이 최선의 방법이라면 JDBC에서 각 파라미터를 두 번 설정해야 하는 것을 피할 수 있는 방법이 있습니까?
저는 듀얼을 해킹으로 생각하지 않습니다.바인딩/타이핑을 두 번 제거하려면 다음과 같은 작업을 수행합니다.
merge into data
using (
select
'someid' id,
'testKey' key,
'someValue' value
from
dual
) val on (
data.id=val.id
and data.key=val.key
)
when matched then
update set data.value = val.value
when not matched then
insert (id, key, value) values (val.id, val.key, val.value);
PL/SQL API 내에서 MERGE를 숨기고 JDBC를 통해 호출합니다.
data_pkg.merge_data ('someid', 'testKey', 'someValue');
MERGE의 대안으로 API는 다음을 수행할 수 있습니다.
begin
insert into data (...) values (...);
exception
when dup_val_on_index then
update data
set ...
where ...;
end;
예외를 확인하는 것을 절약하기 위해 삽입 전에 업데이트를 시도하는 것을 선호합니다.
update data set ...=... where ...=...;
if sql%notfound then
insert into data (...) values (...);
end if;
병합 문을 가지고 있지만, 저는 여전히 이러한 방식으로 단일 행 업데이트를 하는 경향이 있습니다. 단지 더 자연스러운 구문인 것 같습니다.물론 더 큰 데이터 세트를 처리할 때 병합은 실제로 발생합니다.
언급URL : https://stackoverflow.com/questions/167471/oracle-merge-constants-into-single-table
반응형
'programing' 카테고리의 다른 글
AuthStateChanged에서 Firebase Android가 두 번 호출되었습니다. (0) | 2023.07.10 |
---|---|
쿠키에 암호를 저장하는 것이 안전합니까? (0) | 2023.07.10 |
Spring Boot 테스트에서 트랜잭션 커밋을 강제하는 방법은 무엇입니까? (0) | 2023.07.10 |
자동 구성을 중단하지 않고 Spring-Boot에서 MappingMongoConverter(setMapKeyDotReplacement)를 사용자 지정하는 방법은 무엇입니까? (0) | 2023.07.10 |
가지고 놀만한 흥미로운 C/C++ 라이브러리는 무엇입니까? (0) | 2023.07.10 |