PL/SQL for Loop 사용법
DECLARE
/*
커서에 읽어들일 테이블과 업데이트 하고자 하는 테이블이 같을 경우
rowid를 통해서 업데이트 하는게 가장 빠르므로 rowid도 읽어 들인다.
*/
CURSOR c1
IS
SELECT ROWID no#, ID, address1
FROM user0
WHERE INSTR (address1, '충북') > 0;
/*
1000개 단위로 커밋하기 위한 변수
만약 업데이트할 데이타량이 많을경우
롤백세그먼트가 풀나서 DB를 내렸다 올려야 하는 경우가 생길 수 있으므로
반드시 일정단위(보통 1000개)로 커밋을 해주도록 한다.
*/
cnt NUMBER := 0;
/* 예외발생시 DBMS_OUTPUT으로 메세지를 출력하고자 할때
v_ErrorText varchar2(200);
*/
BEGIN
/* DBMS_OUTPUT으로 결과를 보고 싶을 때 사용한다.
DBMS_OUTPUT.ENABLE;
DBMS_OUTPUT.put_line ('어쩌고 저쩌고');
*/
/* for 문을 쓰면 아래와 같은 커서 오픈, fetch, notfound 등의 처리가 필요없다.
-- 커서 오픈
OPEN c1;
LOOP
-- 커서로부터 한개의 행을 추출
FETCH c1
INTO ......;
-- 더이상 추출할 자료가 없는 경우 루프 종료
IF c1%NOTFOUND THEN
EXIT;
END IF;
END LOOP;
*/
FOR r IN c1
LOOP
cnt := cnt + 1;
/* 커서로 읽어들인 rowid를 통해서 업데이트를 수행한다. */
UPDATE user0
SET address1 = REPLACE (address1, '충북', '충청북도')
WHERE ROWID = r.no#;
/* 1000개 단위로 커밋을 수행한다. */
IF cnt = 1000
THEN
COMMIT;
cnt := 0;
END IF;
END LOOP;
/* LOOP 바깥에서도 한번 커밋해준다. */
COMMIT;
/* 예외처리를 한다. 예외 발생했으므로 롤백한다. */
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
/* 에러메제를 확인하고자 할때 사용한다.
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
DBMS_OUTPUT.PUT_LINE('ERROR : ' || v_ErrorText);
*/
END;
[출처] PL/SQL for Loop 사용법 |작성자 듀스포에
'ORACLE·plsql' 카테고리의 다른 글
[펌]deterministic (0) | 2010.02.16 |
---|---|
한글 초성을 리턴해주는 함수 (0) | 2010.02.16 |
[복사되는블로그 꼬마갱이]오라클 JOB 등록하기(문법,설명,예제) (0) | 2010.01.08 |
[펌]Cursor (0) | 2009.12.23 |
[펌]Oracle 프로시저 조건문(IF) (0) | 2009.12.23 |