데이터유무 확인 후 데이터삽입하기. 1 5 4,016

by 정진우 [PL/SQL] 데이터 삽입 데이터유무확인 [2014.01.13 10:46:52]


안녕하세요, 지난번에 로그 수집관련해서 질문을 했던 정진우 라고합니다. ^^

데이터를 조회한 후에, 데이터 유무를 판단해 없으면 데이터를 삽입하려고하는데요.

제 딴에는 오라클쪽을 공부한다고 이래저래 알아보고,

아래와같은 임의블록 을 활용해 쿼리를 작성해보았습니다.

작동이 안되는 것은 아닌데, 조금 더 효율적인 면이나 여러가지면으로 도움을 구하고자 질문을 올립니다.

-- 1.URL 정보를 삽입한다. (없으면 재 삽입을 해야하기 때문에)
SET SERVEROUTPUT ON;
DECLARE
  v_page_index number;
  v_page_url varchar2(200);
  v_url_type char(1);
  v_url_prefix char(1);
BEGIN
  v_page_index := 0;--페이지가 존재하는지 알아보기위한 임이의 변수 초기화
  v_page_url := '127.0.0.1:8989/track_log/webBugTest.jsp';
  v_url_type := '1';
  v_url_prefix := '0'; --http://
  DBMS_OUTPUT.ENABLE;
  SELECT id_url_info into v_page_index
  FROM url_info
  WHERE url_value = v_page_url AND url_type = v_url_type AND url_prefix = v_url_prefix;
  DBMS_OUTPUT.PUT_LINE('해당 URL 데이터가 이미 존재합니다.');
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('URL 데이터를 삽입합니다.');
        INSERT INTO URL_INFO(ID_URL_INFO, URL_VALUE, URL_TYPE, URL_PREFIX) 
        VALUES(SEQ_ID_URL_INFO.NEXTVAL, v_page_url, v_url_type, v_url_prefix);
        COMMIT;
END;

제 로그수집시 로직이

웹페이지 정보를 없으면 등록 하고, 있다면 그대로 활용하는 것인데

구현을 하다보니 궁금한 것이, 

위와 같이 구현하면 데이터 없을때, 익셉션을 통해서 데이터를 저장하거든요. 

1. 만약 데이터가 이미 존재할경우, 한번에 처리되도록하려면 어떻게 해야할까요 ?

2. 그리고 만약에 없더라도 위와같이 예외처리 부분이 호출안되고 다르게 구현하는 방법은 없을까요 ?
by 용근님 [2014.01.13 10:56:35]

by 정진우 [2014.01.13 11:18:25]
아, 감사합니다 !!!!! 

구글링을 해보니, Merge 구문은 Oracle 9 이상부터 지원가능하다고 하는데

아주 만약이지만; 그 이하 버전에서는 다른 방법이 또 있을까요 ??

by 용근님 [2014.01.13 11:24:36]
어떻게든 방법이 없겠나요.. 

하지만 로직상으로 이해하기 쉬우려면 NO_DATA_FOUND 로 처리하는것이 더 깔끔하지 않나 싶네요

by 마농 [2014.01.13 11:25:48]
-- 1. Insert ~ Select(Not Exists)
INSERT INTO url_info(id_url_info, url_value, url_type, url_prefix)
SELECT seq_id_url_info.NEXTVAL
     , :v_page_url
     , :v_url_type
     , :v_url_prefix
  FROM dual
 WHERE NOT EXISTS (SELECT 1
                     FROM url_info
                    WHERE url_value  = :v_page_url
                      AND url_type   = :v_url_type
                      AND url_prefix = :v_url_prefix
                   )
;
-- 2. Merge
MERGE INTO url_info
USING dual
ON (url_value  = :v_page_url
AND url_type   = :v_url_type
AND url_prefix = :v_url_prefix
)
WHEN NOT MATCHED THEN
INSERT INTO (id_url_info, url_value, url_type, url_prefix)
VALUES (seq_id_url_info.NEXTVAL, :v_page_url, :v_url_type, :v_url_prefix)
;

by 정진우 [2014.01.13 16:33:05]
감사합니다 :)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입