Действительно ли возможно уничтожить единый запрос в оракуле, не уничтожая сессию?

Существует очень простой способ использования функции cut ():

    list = as.Date(c("1998-5-2", "1993-4-16", "1998-5-10"))
    cut(list, breaks = "month")

, и вы получите следующее:

    [1] 1998-05-01 1993-04-01 1998-05-01
    62 Levels: 1993-04-01 1993-05-01 1993-06-01 1993-07-01 1993-08-01 ... 1998-05-01
15
задан Ryan Ahearn 21 January 2009 в 20:58
поделиться

3 ответа

Я нашел прием. Я понятия не имею, как безопасный это должно играть с, но это действительно работает. Существует событие Oracle, 10237, который описан, поскольку "моделируют ^C (для тестирования)".

у Вас должны быть SID и SERIAL# сессии, которую Вы хотите прервать.

Вызов SYS.DBMS_SYSTEM.SET_EV ( sid, serial#, 10237, 1, '') для активации события на целевой сессии. Любой в настоящее время выполняющийся оператор должен быть прерван (получение "РТОВ 01013: пользователь запросил отмену текущей операции"). Пока событие установлено, дальнейшие операторы, которые сессия пытается выполнить, сразу завершатся с той же ошибкой.

Для деактивации события выполните тот же вызов с четвертым набором параметра к "0". Сессия затем сможет выполнить операторы снова.

Примечание, что целевая сессия должна обнаружить, что событие установлено, который может занять время, или никогда может не происходить, в зависимости от того, что это делает. Таким образом, Вы не можете только быстро переключить событие на и прочь. Необходимо было бы включить его, проверить, что рассматриваемый оператор остановился, затем выключает его.

Вот некоторый пример кода. Это предназначено, чтобы быть выполненным как анонимный блок в SQLPlus с подставляемыми переменными "sid" и "последовательное" определенный соответственно. Вы могли превратить его в хранимую процедуру с теми как ее параметры.

DECLARE
  l_status  v$session.status%TYPE;
BEGIN

  dbms_system.set_ev( &sid, &serial, 10237, 1, '');

  LOOP
    SELECT status INTO l_status FROM v$session
      WHERE sid = &sid and serial# = &serial;
    EXIT WHEN l_status='INACTIVE';
  END LOOP;

  dbms_system.set_ev( &sid, &serial, 10237, 0, '');
END;
16
ответ дан 1 December 2019 в 03:43
поделиться

Я подозреваю, что это могло бы быть возможно, так как можно сделать это у ЖАБЫ. Пока запрос работает, диалоговое окно Отмены подходит, который можно поразить для остановки запроса.

, Как это реализовано, я не знаю, но очень был бы интересно узнавать также.

при использовании Java, существует java.sql. Отмена оператора () метод, который, как предполагается, делает это. Посмотрите здесь для некоторых примечаний и ограничений...

http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ

2
ответ дан 1 December 2019 в 03:43
поделиться

Вы могли посмотреть на Пределы Ресурса:

, "Если пользователь превышает предел ресурса уровня вызова, то Oracle останавливает обработку оператора, откатывает оператор и возвращает ошибку. Однако все предыдущие операторы текущей транзакции остаются неповрежденными, и сессия пользователя остается связанной".

, Который принимает, причиной отмены SQL является предел ресурса, а не это обновляющий неправильный набор строк (например). Я подозреваю, что Вы не смогли бы влиять на в настоящее время рабочий SQL посредством добавления предела ресурса.

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776
1
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: