본문 바로가기

Database/PLSQL

025 - [Oracle PL/SQL] Cursor - FOR UPDATE & CURRENT OF

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

 

 

 

 

 

select * from employees
where employee_id in (100,200)
order by 1
for update;

# 현재 상황에서는 employees 테이블은 잠김상태가 되므로 다른 업데이트 및 삭제 등,
# 수정을 할 수 없다.

commit;
# commit 명령어가 실행될때까지 변경할 수 없다.

 

 

 

<좌측 그림> for update 실행화면

<우측 그림> for update 때문에 다른 세션에서 update 문이 완료되지 않는다

 

 

 

 

<좌측 그림> commit 실행

<우측 그림> 다른 세션에서 update 문이 완료된다

 

 

 

 

롤백을 통해서 원래대로 복구

 

 

 

 

DECLARE
  CURSOR c_emp_dept30 is
  SELECT employee_id, first_name,salary FROM employees
  where department_id=30
  for update;
  
BEGIN

 for i in c_emp_dept30
 loop
      update employees
      set salary=salary+1
      where employee_id=i.employee_id;
      
  end loop; 
  commit;
END;
------------------------------------------------------------



select employee_id, first_name,salary from employees
where department_id=30;
------------------------------------------------------------

EMPLOYEE_ID FIRST_NAME               SALARY
----------- -------------------- ----------
        114 Den                       11101
        115 Alexander                  3201
        116 Shelli                     3001
        117 Sigal                      2901
        118 Guy                        2701
        119 Karen                      2601

6 rows selected.

 

 

 

위의 샘플코드는 where 조건절을 이용하여 업데이트문을 실행하지만 이부분은 아래 샘플처럼 변경해서 처리가능하다.

* current of xxx

-------------- current of --------------
DECLARE
  CURSOR c_emp_dept30 is
  SELECT employee_id, first_name,salary FROM employees
  where department_id=30
  for update;
  
BEGIN

 for i in c_emp_dept30
 loop
      update employees
      set salary=salary-1
      where current of  c_emp_dept30;   
  end loop; 
  commit;
END;
------------------------------------------------------------

select employee_id, first_name,salary from employees
where department_id=30;
------------------------------------------------------------

EMPLOYEE_ID FIRST_NAME               SALARY
----------- -------------------- ----------
        114 Den                       11100
        115 Alexander                  3200
        116 Shelli                     3000
        117 Sigal                      2900
        118 Guy                        2700
        119 Karen                      2600

6 rows selected.