오라클 10g

PL/SQL - CURRENT OF

무니버 2010. 12. 14. 07:00

 

 

 

데이터의 업데이트시에 바꾸어야할 필드를 지정해 주기위해 조건절 WHERE를 쓰게된다.

이때 이 조건절이 명시적이지 못하면 예기치 못한 오류가 발생할 수 있다. 

 

다음의 예를 살펴보자.

 

 

TBL_NEWSAWON 이라는 다음과 같은 테이블이 있다고 하자.

위에서 연봉이 2000이하인 직원들의 연봉을 300만원씩 올려준다고 해보자.

 

 사원번호  이름      연봉      부서번호 

 

 

  CREATE OR REPLACE PROCEDURE PCD_SALUPDATE

 IS
    CURSOR CUR_SAWON30
    IS
    SELECT SAL
    FROM TBL_NEWSAWON
    WHERE SAL < 2000 AND DEPTNO=30
    FOR UPDATE;

 BEGIN
          FOR i IN CUR_SAWON30 LOOP

          UPDATE TBL_NEWSAWON SET SAL=i.SAL+300;
           
        END LOOP;

 END;
 

 

프로시저 코드에는 문제가 없으나 결과를 보자.

 

 

 

 

우리가 원하는 결과가 아니다. 전혀 엉뚱한 결과가 나왔다. 이것은 커서를쓸때 주의할점은 내가 업데이트,삭제,갱신해야할경우

갱신할 필드를 명시적으로 전해줘야함을 기억하자. 이때 쓰는 키워드는 CURRENT OF 이다.

 

 

WHERE CURRENT OF 커서이름 ;

 

키워드를  WHERE 절에 추가함으로서  문제를 해결할수 있다. 또한 WHERE CURRENT OF 절을 사용하기 전에는 CURSOR의 SELECT 문에 FOR UPDATE 절을 포함시켜 LOCK도 설정해야함을 기억하자.

 

 

<수정된 코드>

 

 CREATE OR REPLACE PROCEDURE PCD_SALUPDATE

 IS
    CURSOR CUR_SAWON30
    IS
    SELECT SAL
    FROM TBL_NEWSAWON
    WHERE SAL < 2000 AND DEPTNO=30
    FOR UPDATE;

 BEGIN
          FOR i IN CUR_SAWON30 LOOP

          UPDATE TBL_NEWSAWON SET SAL=i.SAL+300
             WHERE CURRENT OF CUR_SAWON30;
        END LOOP;
       
 END;

 

제대로된 결과물

 

 


'오라클 10g' 카테고리의 다른 글

오라클에서 우편번호 테이블 연결 방법 1  (0) 2010.12.14
PL/SQL - IN, OUT paramater  (0) 2010.12.14
PL/SQL - FOR UPDATE   (0) 2010.12.13
PL/SQL - 사용자 정의 함수   (0) 2010.12.12
PL/SQL - FOR LOOP 커서문  (0) 2010.12.12