트러블슈팅 오라클 퍼포먼스 2판 (2017년)
커서란? 커서의 생명주기 0 0 22,873

by 구루비스터디 커서 cursor [2023.09.08]


커서란 무엇인가?

커서

  • 공유 SQL 영역과 관련된 Private SQL 영역을 참조하는 Handle.
  • 클라이언트 측 메모리에 위치, 서버 프로세스에 할당된 메모리 구조 참조, 공유 SQL 영역 참조


클라이언트 메모리서버 프로세스 메모리SGA 라이브러리 캐시
핸들Private SQL 영역공유 SQL 영역
  • 바인드 변수 값, 쿼리 수행 상태 정보
  • 특정 세션이 소유 (UGA 에 저장)
  • 부모 커서(SQL 구문의 텍스트) 와 자식 커서(실행 환경과 실행 계획) 구조로 SQL 구문이 수행되는 방법을 명시
  • 여러 세션에서 공유


  • 실무에서 커서는 Private SQL 영역 및 공유 SQL 영역과 구분 없이 사용


커서의 생명주기

번호단계설명
1커서 열기(open cursor)서버 프로세스 메모리, Private SQL 영역 각각 메모리 할당
2커서 파싱(parse cursor)
  • SQL 파싱 결과 및 실행 계획을 공유 SQL 영역에 적재
  • Private SQL 영역은 공유 SQL 영역을 참조
3출력 변수 정의SQL 이 반환하는 값을 받을 변수 정의 (SELECT, RETURNING 절 포함 DML)
4입력 변수 바인딩바인드 변수 사용 SQL에 유효한 값 제공
5커서 실행(execute cursor)SQL 실행
6커거 페치(Fetch cursor)
  • 반환할 값이 있다면 값을 가져온다 (SELECT 문의 중요 단계)
  • 일부 페치 가능
7커서 닫기(close cursor)핸들과 관련된 자원과 private SQL 영역이 해제, 공유 SQL 영역 유지


명시적/묵시적 커서 구현
  • 명시적 : DBMS_SQL 패키지 사용, 세밀한 제어 가능

DECLARE
  l_ename emp.ename%TYPE := 'SCOTT';
  l_empno emp.empno%TYPE;
  l_cursor INTEGER;
  l_retval INTEGER;
BEGIN
  l_cursor := dbms_sql.open_cursor;
  dbms_sql.parse(l_cursor, 'SELECT empno FROM emp WHERE ename = :ename', 1);
  dbms_sql.define_column(l_cursor, 1, l_empno);
  dbms_sql.bind_variable(l_cursor, ':ename', l_ename);
  l_retval := dbms_sql.execute(l_cursor);
  IF dbms_sql.fetch_rows(l_cursor) > 0
  THEN
    dbms_sql.column_value(l_cursor, 1, l_empno);
    dbms_output.put_line(l_empno);
  END IF;
  dbms_sql.close_cursor(l_cursor);
END;


묵시적
  • 커서 제어를 PL/SQL 컴파일러에 위임 (대부분 Good)

DECLARE
  l_ename emp.ename%TYPE := 'SCOTT';
  l_empno emp.empno%TYPE;
BEGIN
  SELECT empno INTO l_empno
  FROM emp
  WHERE ename = l_ename;
  dbms_output.put_line(l_empno);
END;
/

"데이터베이스 스터디모임" 에서 2017년에 "전문가를 위한 트러블슈팅 오라클 퍼포먼스(Second Edition) " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4333

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입