ORACLE·plsql

[펌]PL/SQL for Loop 사용법

administrators 2009. 12. 23. 16:58

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 사용법 |작성자 듀스포에

http://blog.naver.com/pureb612b/10038526810