② 다중 로우 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 절을 혼합해 사용한 점이 단일 로우를 변경할 때와는 다르다는 점을 꼭 기억해 두자.