더북(TheBook)

④ 다중 로우 DELETE

한 번에 여러 행을 삭제할 때도 RETURNING INTO 절을 사용해 삭제된 정보를 가져올 수 있다. 다중 로우를 삭제해 반환되는 행이 여러 개이므로 다중 로우를 UPDATE 했을 때처럼 컬렉션 변수와 BULK COLLECT INTO 절을 사용해야 한다.

입력

    DECLARE
      -- 레코드 타입 선언
      TYPE NT_EMP_REC IS RECORD (
           emp_name      employees.emp_name%type,
           department_id employees.department_id%type,
           job_id        employees.job_id%type);

      -- NT_EMP_REC 레코드를 요소로 하는 중첩 테이블 선언
      TYPE NTT_EMP IS TABLE OF NT_EMP_REC;
      -- NTT_EMP 중첩 테이블 변수 선언
      VR_EMP NTT_EMP;

    BEGIN
      -- 60번 부서에 속한 사원 삭제 ...
      DELETE emp_bk
       WHERE department_id = 60
      RETURNING emp_name, department_id, job_id
      BULK COLLECT  INTO VR_EMP;

      COMMIT;

      FOR i in VR_EMP.FIRST .. VR_EMP.LAST
      LOOP
        DBMS_OUTPUT.PUT_LINE(i || '--------------------------------');
        DBMS_OUTPUT.PUT_LINE('변경 사원명 : ' || VR_EMP(i).emp_name);
        DBMS_OUTPUT.PUT_LINE('변경 부서 : ' || VR_EMP(i).department_id);
        DBMS_OUTPUT.PUT_LINE('retire_date : ' || VR_EMP(i).job_id);
      END LOOP;
    END;

결과

    1--------------------------------
    변경사원명 : Alexander Hunold
    변경부서 : 60
    retire_date : IT_PROG
    2--------------------------------
    변경사원명 : Bruce Ernst
    변경부서 : 60
    retire_date : IT_PROG
    3--------------------------------
    변경사원명 : David Austin
    변경부서 : 60
    retire_date : IT_PROG
    4--------------------------------
    변경사원명 : Valli Pataballa
    변경부서 : 60
    retire_date : IT_PROG
    5--------------------------------
    변경사원명 : Diana Lorentz
    변경부서 : 60
    retire_date : IT_PROG

이런 식으로 RETURNING INTO 절을 사용하면 별도의 SELECT문을 사용하지 않고서도 UPDATE나 DELETE된 로우의 정보를 추출해 낼 수 있다. 지금까지 함수, 프로시저, 패키지 등의 프로그램을 작성할 때 활용할 수 있는 몇 가지 디버깅 기법에 대해 살펴 보았다. 이 장에서 소개한 방법 외에도 훨씬 더 기발한 방법을 얼마든지 찾을 수 있으므로 독자 여러분도 좋은 아이디어를 내어 더 나은 방법을 스스로 찾아 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.