데이터의 업데이트시에 바꾸어야할 필드를 지정해 주기위해 조건절 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 |