programing

Oracle 상수를 단일 테이블로 병합

muds 2023. 7. 10. 22:59
반응형

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

반응형