더북(TheBook)

② 다중 로우 UPDATE

이번에는 여러 개의 로우를 갱신하는 UPDATE문을 실행해 보자. 이때 갱신되는 로우가 1개 이상이므로 단일 변수에는 담아올 수 없고 컬렉션 변수에 담아야 한다.

입력

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

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

    BEGIN
      -- 100번 부서의 retire_date를 현재일자로 ...
      UPDATE employees
         SET retire_date = SYSDATE
       WHERE department_id = 100
      RETURNING emp_name, department_id, retire_date
      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).retire_date);
      END LOOP;
    END;

결과

    1--------------------------------
    변경사원명 : Nancy Greenberg
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07
    2--------------------------------
    변경사원명 : Daniel Faviet
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07
    3--------------------------------
    변경사원명 : John Chen
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07
    4--------------------------------
    변경사원명 : Ismael Sciarra
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07
    5--------------------------------
    변경사원명 : Jose Manuel Urman
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07
    6--------------------------------
    변경사원명 : Luis Popp
    변경부서 : 100
    retire_date : 2015-04-18 21:57:07

결과를 보면 총 6개의 로우가 갱신되었음을 알 수 있다. NT_EMP_REC 레코드를 요소로 하는 NTT_EMP 중첩 테이블 변수인 VR_EMP를 선언했고 RETURNING INTO 절을 사용해 VR_EMP 변수에 UPDATE된 로우의 emp_name, department_id, retire_date 컬럼 값을 넣었다. 또한 1개 로우 이상을 갱신해서 반환하므로 그냥 INTO가 아닌 BULK COLLECT INTO 절을 사용했다. 그 다음에는 루프를 돌면서 VR_EMP 변수에 저장된 emp_name, department_id, retire_date 컬럼 값을 DBMS_OUTPUT.PUT_LINE 프로시저를 사용해 출력했다. 변경된 다중 로우가 반환되므로 컬렉션 변수와 BULK COLLECT INTO 절을 혼합해 사용한 점이 단일 로우를 변경할 때와는 다르다는 점을 꼭 기억해 두자.

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