상세 컨텐츠

본문 제목

오라클 커서(Oracle cursor) 관련 내용

DataBase/Oracle

by 탑~! 2015. 1. 16. 09:22

본문

[오라클 커서 ]
* 커서 : 'sql이 하나 실행될때 마다 커서가 하나 열린다.'
* 커서가 열리면 반드시 닫아줘야 한다.
* 간혹: 'ORA-01000 : 최대 열기 커서 수를 초과' 에러가 발생하는데 , 이는 커서를 열고 커서를 닫지 않아서 이다.
        > jdbc프로그램 하면서 Preparestatement , Result 이런것들을 close() 하지 않아서 발생
  ( Connection을 닫지 않았을 때는  'ORA-00020: maximum number of processes (100)' 와 같은 프로세스 수 에러가 발행한다.)

 
 > 또, 루프안에서 위 객체를 생성하였으면, 루프내에서 close해줘야 한다. 루프밖에서 한번 닫으면 안된다.
   ,예를 들어 루프안에서 10번 객체를 생성해 놓고, 루프밖에서 1번 닫으면 9개의 객체는 커서를 닫지 않은 상태로 있다.


[파라미터  open_cursors ]
*의미: '한 세션당' 최대 오픈할 수 있는 커서수
*커서수 조정 :  v$parameter   테이블의 open_cursors 수를 조정한다.
       ex) 'alter system set open_cursors=커서수  scope=both'  (memory/spfile/both: 기본값은 memory)

 


[ 열린 CURSOR  관련 동적view  찾기 sql ]
EX) 오래된 접속 세션 순서
SELECT o.sid, osuser, machine, min(s.last_call_et ) as lastcall
, sysdate, min(sysdate-s.last_call_et/24/60/60) as lastcalldate,  COUNT(*) num_curs
 FROM v$open_cursor o, v$session s
 WHERE  o.sid=s.sid  
 GROUP BY o.sid, osuser, machine 
ORDER BY  lastcall DESC;

----------------------------------------------------------

EX) 오래된 접속 sql순서

select a.*, q.sql_text
from
(
SELECT o.sid, osuser, machine, min(s.last_call_et ) as lastcall, sysdate, min(sysdate-s.last_call_et/24/60/60) as lastcalldate,  COUNT(*) num_curs,min(o.hash_value) hash 
 FROM v$open_cursor o, v$session s
 WHERE  o.sid=s.sid 
 GROUP BY o.sid, osuser, machine 
ORDER BY  lastcall DESC
) a
, v$sql q
where
q.hash_value=a.hash 
--and machine like '%webcash-4ej936i%'
ORDER BY  lastcall DESC
---------------------------------------------------
EX)열린(안닫힌) 커서가 많은 세션
SELECT o.sid, osuser, machine, COUNT(*) num_curs
 FROM v$open_cursor o, v$session s
 WHERE  o.sid=s.sid
 GROUP BY o.sid, osuser, machine
ORDER BY  num_curs DESC; 
--------------------------------------------------

EX) 커서가 열린(안닫힌) sql문 
SELECT q.sql_text
FROM v$open_cursor o, v$sql q
WHERE q.hash_value=o.hash_value AND o.sid=:sid
---------------------------------------------------

EX SQL문당 사용하는 커서수 - 해당sql이 사용하는 커서수를 말한다.
SELECT sql_text, count(sid) cnt 
FROM v$OPEN_CURSOR 
GROUP BY sql_text 
ORDER BY cnt DESC


'DataBase > Oracle' 카테고리의 다른 글

[오라클] 테이블, 컬럼 목록 조회  (0) 2015.02.13
Oracle 암호화 / 복호화  (0) 2015.01.22
오라클 DB Link 생성  (0) 2014.10.23
Oracle 패스워드에 사용가능한 특수문자  (0) 2014.10.10
사용자 계정 잠금해제  (0) 2014.07.01

관련글 더보기