Как узнать, какие курсоры были открыты с помощью функции, которую я запустил?
Итак, приведенный ниже запрос скажет вам, что такое открытые курсоры (вы можете указать username
)
select a.value, s.username, s.sid, s.serial#
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current';
Тогда из sid вы можете узнать запрос.
select * from v$sqlarea where sql_id in(
select case when sql_id is null then prev_sql_id else sql_id end from v$session where sid in (
select s.sid
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid
and b.name = 'opened cursors current'
and username='usersomething')
)
Есть ли у курсоров уникальные идентификаторы, которые я должен использовать для их различения?
Хорошо, когда выполняется выбор, курсор открывается, приведенный выше запрос сообщит вам, какие запросы открыли курсор.Существуют 2 типа курсоров: неявный курсор и явный, запустив select 1 из dual, это неявный курсор, который оракул открывает и закрывает его, явный - когда вы объявляете курсор (с select), который вы открываете и закрываете (хорошо, если вы используете for .. in ..loop
, он будет закрываться самостоятельно)
(В соответствии с моим пониманием и проведенным тестом, когда вы закрываете соединение, оракул закроет курсоры)
2-Должен ли я смотреть только на открытые курсоры или я должен также беспокоиться о закрытых курсорах?Могут ли они внезапно стать открытыми курсорами?
В указанных выше пределах ошибок, связанных с открытыми курсорами, курсор может быть открыт при повторном выполнении запроса.поэтому вы должны проверить наличие открытых курсоров.
вы можете пропустить эту ошибку ORA-01000 maximum open cursors exceeded
, увеличив число курсоров alter system set open_cursors = 400 scope=both
(по умолчанию это выглядит как 50
oracle doc)
В этом ответе содержится большое объяснение причин, стоящих за ORA-01000: maximum open cursors exceeded
, и некоторых способов его устранения. java.sql.SQLException: - ORA-01000: превышено максимальное количество открытых курсоров