Oracle ref курсор выборка зависает, если он содержит 1 одну запись - PullRequest
0 голосов
/ 02 марта 2011

У меня сейчас странная проблема: если курсор возврата возвращается из хранимой процедуры, в которой есть только 1 запись, операция извлечения будет зависать и зависать. Выполнение хранимой процедуры было действительно быстрым, просто процесс извлечения зависает. Если ссылка ref имеет более 1 записи, то все в порядке. У кого-нибудь были подобные проблемы раньше?

Сервер Oracle работает на Linus 11g. Клиент - Windows Server 2003. Я тестирую это, используя стандартный инструмент Oracle sqlplus на Windows Server.

Любая помощь и комментарии будут с благодарностью. спасибо.

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Когда вы говорите, что зависает, что вы имеете в виду?

Если сеанс все еще активен в базе данных (состояние в V $ SESSION), то он, вероятно, ожидает какого-то события (например, SQL * Net отклиент означает, что он ждет, чтобы клиент что-то сделал).

Возможно, запросу требуется много времени, чтобы обнаружить, что строк больше нет.Рассмотрим таблицу из 10 000 000 строк без индексов.Запрос может полностью отсканировать таблицу и найти первую строку, соответствующую критериям.Он все еще должен отсканировать следующие 9 999 999 строк, чтобы найти, что они этого не делают.Это может занять некоторое время.

1 голос
/ 02 марта 2011

Поскольку вы говорите, что процесс зависает, есть ли вероятность, что ваш курсор делает «выбор для обновления» вместо «выбор»? Поскольку вы говорите, что выборка нескольких записей не вызывает этой ошибки, это может быть не так.

Можете ли вы показать нам код (или воспроизводимый небольшой тест / образец) для вашего выбора и выборки.

Кроме того, вы можете проверить v $ locked_objects, используя следующий запрос и указав в именах таблиц, чтобы убедиться, что рассматриваемый объект заблокирован. Опять же, если ваш текущий запрос не имеет «для обновления», эта выборка не должна зависать.

select do.* 
  from v$locked_objects vo,
       dba_objects      do
  where vo.object_id = do.object_id
    and vo.object_name = '<your_table_name>'
...