메뉴 건너뛰기

(*.106.188.101) 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

가 크게 작게 위로 아래로 댓글로 가기 첨부
Extra Form
출처 http://egloos.zum.com/nagid/v/3017597
오라클 Merge / 수행 결과값 리턴하지 않을 때

오라클에 Merge 가 있다.


아실랑가 모르겠지만, 오라클에서 복잡하게 대량으로 업데이트, 삭제 할려고 하면
서브쿼리 쓰던가 
조인뷰를 쓰던가
merge구문을 쓰면 된다.

근데 오라클은 Ms-sql과 달리, 쓰는 방식에 제약이 좀 따른다.
조인뷰의 /*+ BYPASS_UJVC */  힌트는 11g에서 안먹힘.

그래서 1:1의 수정이 아닌 경우에는 좌절됨.
서브쿼리는 속도가 느리다.
그래서 merge를 쓰면 쾌적한 업데이트와 삭제를 하는데
문제는 이게 수행 결과값을 리턴하지 않는다는 것이다.
즉, 몇개 넣었다라는 메세지를 안보내준다.


위를 보다시피 안보인다.
뭐가 얼만큼 실행되었는지 보이지 않는다는 말이다.
한마디로 장님이 된다는 소리.
100만건 업데이트 했는지, 10건 업데이트 했는지 모른다면 어찌 그걸 사용할 수 있으랴?
그래서 존나 인터넷으로 달렸다.
그래서 찾았다.
오호라 구글신이시여

먼저 package를 만들어야 함.

CREATE OR REPLACE PACKAGE etl AS

   c_inserting CONSTANT PLS_INTEGER := 0;
   c_updating  CONSTANT PLS_INTEGER := 1;

   FUNCTION merge_counter (
            action_in IN PLS_INTEGER DEFAULT c_inserting
            ) RETURN PLS_INTEGER;

   FUNCTION get_merge_update_count RETURN PLS_INTEGER;

   FUNCTION get_merge_update_count (
            merge_count_in IN PLS_INTEGER
            ) RETURN PLS_INTEGER;

   FUNCTION get_merge_insert_count RETURN PLS_INTEGER;

   FUNCTION get_merge_insert_count (
            merge_count_in in PLS_INTEGER
            ) RETURN PLS_INTEGER;

   PROCEDURE reset_counters;

END etl;


CREATE OR REPLACE PACKAGE BODY etl AS

   g_update_counter PLS_INTEGER NOT NULL := 0;
   g_insert_counter PLS_INTEGER NOT NULL := 0;

   /*----------- FUNCTION merge_counter -----------*/
   FUNCTION merge_counter (
            action_in IN PLS_INTEGER DEFAULT c_inserting
            ) RETURN PLS_INTEGER IS
   BEGIN
      CASE action_in
         WHEN c_updating
            THEN g_update_counter := g_update_counter + 1;
         WHEN c_inserting
            THEN g_insert_counter := g_insert_counter + 1;
         ELSE
            RAISE PROGRAM_ERROR;
      END CASE;
      RETURN 0;
   END merge_counter;

   /*----------- FUNCTION get_merge_update_count V1 -----------*/
   FUNCTION get_merge_update_count
      RETURN PLS_INTEGER is
   BEGIN
      RETURN g_update_counter;
   END get_merge_update_count;

   /*----------- FUNCTION get_merge_update_count V2 -----------*/
   FUNCTION get_merge_update_count (
            merge_count_in IN PLS_INTEGER
            ) RETURN PLS_INTEGER IS
   BEGIN
      RETURN NVL( merge_count_in - g_insert_counter, 0 );
   END get_merge_update_count;

   /*----------- FUNCTION get_merge_insert_count V1 -----------*/
   FUNCTION get_merge_insert_count
      RETURN PLS_INTEGER IS
   BEGIN
      RETURN g_insert_counter;
   END get_merge_insert_count;

   /*----------- FUNCTION get_merge_insert_count V2 -----------*/
   FUNCTION get_merge_insert_count (
            merge_count_in IN PLS_INTEGER
            ) RETURN PLS_INTEGER IS
   BEGIN
      RETURN NVL( merge_count_in - g_update_counter, 0 );
   END get_merge_insert_count;

   /*----------- FUNCTION reset_counters -----------*/
   PROCEDURE reset_counters IS
   BEGIN
      g_update_counter := 0;
      g_insert_counter := 0;
   END reset_counters;

END etl;


여기까지만 쓰면 만사 오케이

SET SERVEROUTPUT ON;
BEGIN
    MERGE INTO  사원테이블1 X
    USING(
           SELECT a.emp_id, b.deptcd_acct  rep_comp_cd2 
               FROM 사원테이블1 a
                  , 사원테이블2 b
              WHERE a.emp_id= b.emp_id
                and b.status = '1'
          ) B
    ON (X.emp_id = B.emp_id)
    WHEN MATCHED THEN
          UPDATE 
          SET  X.in_user = '업데이트1'
            ,  X.in_time = SYSDATE
          ;
          
    DBMS_OUTPUT.PUT_LINE( TO_CHAR(SQL%ROWCOUNT) || ' 줄 반영되었어..');
    DBMS_OUTPUT.PUT_LINE( TO_CHAR(etl.get_merge_insert_count) || ' 줄 추가되었어.');
    DBMS_OUTPUT.PUT_LINE( TO_CHAR(etl.get_merge_update_count( SQL%ROWCOUNT ))|| ' 줄 수정되셨어.');

END;




  1. 텍스트 분석 솔루션 (Smart TA)

  2. No Image 12Aug
    by
    2019/08/12 Views 792 

    빅데이터의 속성 3V, 4V, 5V

  3. No Image 27Jul
    by
    2019/07/27 Views 811 

    마크베이스(Machbase) - IoT Gateway for Edge Analytics

  4. DB접근제어 - Chakra (샤크라)

  5. DB접근제어 - DBSAFER

  6. EDI (Electronic Data Interchange)

  7. No Image 23May
    by
    2016/05/23 Views 492 

    오라클, 특정 테이블의 인덱스명과 구성컬럼 조회 SQL

  8. No Image 23May
    by
    2016/05/23 Views 489 

    Oracle Data Dictionary

  9. 21May
    by 정보제공
    2016/05/21 Views 698 

    Oracle Merge (수행 결과값 리턴않음)

  10. No Image 19May
    by
    2016/05/19 Views 481 

    ODBC. JDBC

  11. No Image 19May
    by
    2016/05/19 Views 504 

    (빅데이터 분석) R / R-studio 소개

  12. No Image 19May
    by
    2016/05/19 Views 573 

    Oracle wm_concat, listagg, xml parsing

  13. No Image 14May
    by
    2016/05/14 Views 478 

    데이터베이스 개념, 스키마, DB언어, 관계형 데이터베이스의 종류, 키의 개념, DB설계, 개체관계도[ERD]

  14. No Image 08May
    by
    2016/05/08 Views 493 

    Oracle - sqldeveloper-4.1.3.20.78-x64

  15. No Image 08May
    by
    2016/05/08 Views 486 

    오라클 SQL & PLSQL 강좌 #3/3

  16. No Image 08May
    by
    2016/05/08 Views 438 

    오라클 SQL & PLSQL 강좌 #2/3

  17. No Image 08May
    by
    2016/05/08 Views 472 

    오라클 SQL & PLSQL 강좌 #1/3

  18. Crystal Reports OLAP

  19. No Image 29Apr
    by
    2016/04/29 Views 428 

    빅데이터 IBM 자료

  20. Large Object - LOB의 저장방식 및 사용법

목록
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7