[SQLD/P] Oracle Cursor

Hyo Kyun Lee·2022년 9월 15일
0

SQLD/P

목록 보기
24/82

1. Oracle Cursor

Query를 하게되면 Oracle server를 실행하게 되고, 이 server는 Query 결과를 인스턴스 내부의 PGA영역에 저장한다.

이후 application, 즉 user가 실행하는 프로그램은 실행하기전에 user process를 실행하고 프로그램을 최종적으로 실행(run)한다.

참고로 이 user application은 내부적으로 Oracle DB와 상호작용을 위한 API가 저장되어있는 Oracle DB Library을 보유하고 있다. 즉 application을 실행하면 user process와 oracle server process가 서로 상호작용을 하면서 data를 찾게 된다.

이때 user process는 server process의 PGA영역, 즉 Query 결과가 모여있는 주소를 가르킨다. 이 주소를 가르키는 변수는 포인터 변수가 되고, 이 포인터를 커서(Cursor)라 일컫는다.

※ 참고로 Oracle 메모리 구조는 인스턴스가 서로 공유하는 SGA영역과, User 한명에게만 공유하여 인스턴스 내부에서만 가지는 PGA영역으로 나뉜다.

2. Cursor open error

이러한 Cursor가 비정상적으로 작동한다면 다양한 오류를 발생하는데, 이 중 Cursor open error는 말 그대로 해당 포인터가 PGA 주소를 제대로 읽지 못하고 있는 에러이다.

이에 대한 원인은 다양하겠지만 경험한 바로는

  • DB와 상호작용 하기 위한 library를 호출하는 과정에서 오류 발생(DB를 호출하는 과정 자체도 transaction에 포함되어, transaction error로 표기될 수 있음)
  • 일전 query를 사용하고 DB Cursor close를 하지 않거나, 비정상적으로 동작하여 open 시 오류 발생
  • query 결과(record 수)가 PGA 메모리를 초과하여 비정상적인 동작으로 인해 오류 발생

다양한 상황에서 오류가 발생할 수 있으므로, 일단 로그를 확인하는 것이 필요하다.
특히 중요한 점은, 이러한 예외/오류처리를 누락하여 다음 쿼리, 처리 진행에 영향을 줄 수 있다는 점이므로 반드시 처리를 진행하기 전에 로직을 다시 한번 살펴보는 것도 중요하다.

3. 참고자료

Oracle Cursor 개념1 - https://fsl-dev.tistory.com/entry/%EC%8B%A4%EB%AC%B4%EC%97%90-%EC%82%AC%EC%9A%A9-%EB%90%98%EB%8A%94-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%BB%A4%EC%84%9C-CURSOR-%EC%82%AC%EC%9A%A9%EB%B2%95
Orace Cursor 개념2 - https://gdtbgl93.tistory.com/152

Oracle memeory 구조(공식문서) - https://docs.oracle.com/cd/E11882_01/server.112/e40540/memory.htm#CNCPT1237
Oracle memory 구조 - https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=236107#

0개의 댓글