Oracle PL/SQL 강좌
The WHERE CURRENT OF Clause 8 6 34,986

by 김정식 WHERE CURRENT OF EXPLICIT CURSOR PL/SQL CURSOR [2002.01.20]


WHERE CURRENT OF

  ROWID를 이용하지 않고도 현재 참조하는 행을 갱신하고 삭제할 수 있게 한다.

  추가적으로 FETCH문에 의해 가장 최근에 처리된 행을 참조하기 위해서 "WHERE CURRENT OF 커서이름 " 절로 DELETEUPDATE문 작성이 가능하다.

  이 절을 사용할 때 참조하는 커서가 있어야 하며, FOR UPDATE절이 커서 선언 query문장 안에 있어야 한다. 그렇지 않으면 에러가 발생한다.

WHERE CURRENT OF 예제

 
-- DBMS_OUTPUT.PUT_LINE을 출력하기 위해 사용
SQL> SET SERVEROUTPUT ON;  

SQL> CREATE OR REPLACE PROCEDURE where_current 
     IS

        CURSOR emp_list IS 
             SELECT empno 
             FROM emp 
             WHERE empno = 7934 
             FOR UPDATE; 

     BEGIN 

        --DBMS_OUTPUT.PUT_LINE명령을 사용하기 위해서 
        DBMS_OUTPUT.ENABLE;    

        FOR emplst IN emp_list LOOP
         
           --emp_list커서에 해당하는 사람의 직업을  SALESMAN으로 업데이트 시킵니다.
           UPDATE emp 
           SET job = 'SALESMAN' 
           WHERE CURRENT OF emp_list; 

           DBMS_OUTPUT.PUT_LINE('수정 성공');

        END LOOP; 
  
        EXCEPTION
           WHEN OTHERS THEN 
           -- 에러 발생시 에러 메시지 출력
           DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM); 
    END;  
    /

--먼저 데이터를 확인해 보자
SQL> SELECT job FROM emp WHERE empno = 7934;

JOB
---------
CLERK

 --PLSQL을 실행시키고..
SQL> EXECUTE where_current;
수정 성공 

-- 데이터를 확인하면 변경된 것을 확인 할 수 있다. 
SQL> SELECT job FROM emp WHERE empno = 7934;
 
JOB
---------
SALESMAN
    

- 강좌 URL : http://www.gurubee.net/lecture/1068

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 디스타임 [2007.11.09 16:12:34]
끝까지 강좌를 보겠다는 다짐을.. --+
감사하게 보겠습니다. ^^

by 김윤경 [2007.11.12 16:35:07]
어디서 본 듯 한데 여기서 보네요.
where current of 커서 많이 쓰이는 것 같아요.
설명이 간단하고 이해하기 쉬워요^^;;

by 궁금이 [2009.10.27 16:10:49]
업데이트문에 WHERE empno = 7934 만 있으면 조건이 되는데
왜 저렇게 따로 분리되서 했을까요?
궁금하네요..

by finecomp [2009.10.28 15:44:36]
그럼 맨처음 선언된 커서에 아예 조건이 없다고 상상 해 보세요...
이게 편할 지 안편할지...^^;

by 야호 [2012.01.27 11:25:29]
저도 처음에 위에 조건이 있는데 왜 하지 했는데,,조건이 없으면 편리 하겠네요^^

by 상유니 [2016.01.10 13:12:25]

commit 은 안해주나요?

커밋을 안해주면 for update 때문에 Lock 이 걸려서 

다른 세션에서 empno=7934 인 행에 접근시 무한대기에 걸려버릴텐데요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입