④ 다중 로우 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된 로우의 정보를 추출해 낼 수 있다. 지금까지 함수, 프로시저, 패키지 등의 프로그램을 작성할 때 활용할 수 있는 몇 가지 디버깅 기법에 대해 살펴 보았다. 이 장에서 소개한 방법 외에도 훨씬 더 기발한 방법을 얼마든지 찾을 수 있으므로 독자 여러분도 좋은 아이디어를 내어 더 나은 방법을 스스로 찾아 보자.