● 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
'기타 개념 > 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 |