기타 개념/Oracle

오라클 - 프로시저, 커서

워제하 2024. 9. 6. 10:12

CURSOR (커서)

- 오라클 서버에서 SQL문 실행할때마다 처리를 위한 메모리공간

- Oracle은 프로시저 내부에서 커서Cursor를 사용할수 있음.

- 행의 집합을 다루기에 많은 편리한 기능을 제공

- 테이블에서 여러개의 행을 쿼리한 후 , 쿼리의 결과인 행 집합을 한 행씩 처리하기 위한 방식

 

*처리 순서

커서 선언 (CURSOR 커서이름 )  --> 커서열기 ( OPEN 커서이름) --> LOOP문으로 ( 커서에서 데이터 가져오기(FETCH) --> 데이터 처리  ) -->커서 닫기 (CLOSE 커서이름 )

    - FETCH문을 통해 커서에서 한행씩 데이터를 읽고, LOOP문을 통해 모든 행을 처리한 후 커서를 닫음 

 

%NOTFOUND  :  커서 영역의 자료가 모두 FETCH 됐었다면 TRUE

%FOUND  :  커서영역에 FETCH 되지않은 자료가 있다면 TRUE

%ISOPEN  :  커서가 OPEN 상태이면 TRUE

%ROWCOUNT  :  커서가 얻어 온 레코드의 개수

 

 

예시 ) 

- OPEN ~ LOOP~ FETCH ~ END LOOP ~ CLOSE

- FOR문을 사용하면 OPEN~CLOSE 사용없이 :  FOR  ~ LOOP ~ END LOOP

 

 

 

●  프로시저 ( PROCEDURE )

- PL/SQL 을 저장해놓고 필요한 경우만 호출할때. 

- 오라클에서 데이터베이스에 저장할수있도록 저장 프로시저라는것을 제공한다.

 

 

예시 ) BEGIN 2개 사용했음

CREATE OR REPLACE PROCEDURE  프로시저 이름
IS
    CURSOR 커서 이름
     IS 
        SELECT
           FROM
        WEHRE ;
        커서변수명 커서 이름%ROWTYPE;

BEGIN
    ( 이 사이에 또 다른 BEGIN을 넣을 수도 있고 IF 문을 넣을 수도 있음, if 사용한다면 if 끝나는 지점에 END IF; 해줘야 함)
     OPEN 커서 이름;  // 커서를 열어 DB로 부터 데이터를 가져올 준비
     LOOP
       FETCH 커서 이름 INTO 커서를 담을 변수명;
       EXIT WHEN 커서 이름%NOTFOUND:
     
       BEGIN
           SELECT or UPDATE or INSERT 등등 쿼리문 작성
              FROM
            WEHRE ;
          COMMIT;
        EXCEPTION
              WHEN 변수명(ex.NO_DATA_FOUND) THEN
                    INSERT OR NULL 등.;
             ( 여기에
                WHEN OTHERS THEN
                   NULL; 등 다른 WHEN 조건도 넣을 수 있음  )

        END; // EXCEPTION의 END
     END LOOP;

     ClOSE 커서명;  //open 한걸 close로 닫음
END; // 첫번째 BEGIN의 END

EXCEPTION
   WHEN NO_DATA_FOUND THEN
      .....;
   NULL;
WHEN OTHERS THEN
     .......;
    ROLLBACK;


END;
  

 

 

- PSTK CUR_PSTK%ROWTYPE : PSTK라는 변수를 선언하고,

                                                         이 변수는 CUR_PSTK 커서가 반환하는 레코드 타입과 동일한 구조를 가짐.

                                                         즉, 커서가 선택하는 각 행을 PSTK라는 변수에 담을 수 있게 됨.

- OPEN CUR_PSTK : 커서를 열어 데이터베이스로부터 데이터를 가져올 준비
- LOOP … FETCH INTO PSTK : 커서에서 한 행의 데이터를 PSTK에 가져오는 과정.

                                                     커서가 한 번에 하나의 레코드를 읽어와 PSTK에 저장.
- EXIT WHEN CUR_PSTK%NOTFOUND : 더 이상 커서에 가져올 데이터가 없으면 루프를 종료하는 조건

- CUR_PSTK%NOTFOUND : 커서가 마지막 행까지 데이터를 다 읽었는지 확인하는 데 사용
- CLOSE CUR_PSTK : 커서 작업이 끝나면 커서를 닫아 자원을 해제

 

 

 

프로시저 시작

DECLARE
BEGIN
	프로시저명
END;

 

 

만약 잡으로 실행시켜 돌아가고 있는 프로시저를 수정하기 위해서는 세션 모니터에 들어가

현재 프로시저를 사용하고 있는 세션을 kill 한 다음에 수정하면 바로 수정이 된다.

(실행되고 있는 프로시저를 수정하려하면 렉이 걸리면서 15분이 지나면 자동 취소된다.)

 

 

 

 

 

< COMMIT에 대해서는 다음 글에 적어놓음 >

https://ju5710.tistory.com/373

 

 

 

 

 

 

 

 

 

 

 

참고 : https://yjdawn.tistory.com/2

'기타 개념 > Oracle' 카테고리의 다른 글

<if test = ‘’>  (0) 2024.12.19
Choose, when, otherwise  (0) 2024.12.16
Union, Union All  (2) 2024.09.26
테이블 권환 확인  (0) 2024.09.19
오라클 - 프로시저의 COMMIT  (1) 2024.09.06