powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прервать выполнение конкретного запроса SQL_ID без удаления сессии
12 сообщений из 12, страница 1 из 1
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39346825
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Кто знает простой и надежный способ прервать выполнение конкретного запроса SQL_ID без удаления сессии ?
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39346924
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolev,

Не знаю критериев простоты/надежности, но http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/ как вариант.
Я протестировал с dbms_resource_manager - запрос обрывается с ORA-00040

Regards

Maxim
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39346936
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39348586
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сработало вот так , 12.1.0.2.0

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
DECLARE
   l_status   v$session.status%TYPE;
BEGIN
   FOR L_c
      IN (SELECT SM.SID, SM.SESSION_SERIAL#, SM.INST_ID
            FROM gv$sql_monitor SM
           WHERE 
                SM   .SQL_ID = '7nb76awdu8hsa'
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SM.ELAPSED_TIME / 1000000 >= 60)
   LOOP
      BEGIN
         DBMS_SYSTEM.set_ev (l_c.SID,
                             l_c.SESSION_SERIAL#,
                             10237,
                             1,
                             '');

         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

         DBMS_SYSTEM.set_ev (l_c.SID,
                             l_c.SESSION_SERIAL#,
                             10237,
                             0,
                             '');
      END;
   END LOOP;
END;
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39348764
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрел
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39348786
Вячеслав ЛюбомудровSergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрелнайдет sql_id этой байды и ...
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39349978
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приму все конструктивные предложения по улучшению алгоритма :)
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39350240
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровSergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрелЕсли с таймаутом, то cancel получат все sql-операторы, которые сессия будет пытаться выполнять в течение этого таймаута. Грубовато, тогда уж проще kill.
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39350242
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет же
Просто, если скажем, в течении минуты-пяти состояние сессии не изменилось, просто вернуть событие взад и отрапортавать об этом.
Скорее всего, оно уже и не сработает
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39350261
marked for cancel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем вообще этот цикл?
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39350278
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, что отсюда , но там как раз есть таймаут
...
Рейтинг: 0 / 0
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
    #39358457
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так лучше ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
/* Cancel  concrete querys SQL_ID on ' ELAPSED_TIME> X...Y
    Run by SYS */
DECLARE
   l_status   v$session.status%TYPE;
BEGIN
   FOR L_c
      IN (
           SELECT SM.SID, SM.SESSION_SERIAL#, SM.INST_ID
            FROM gv$sql_monitor SM, v$session VS
           WHERE  (SM.SID= VS.SID AND SM.SESSION_SERIAL#= VS.SERIAL#)
               AND  VS.STATUS = 'ACTIVE'
                AND
                (
                (SM.SQL_ID IN ('7nb76awdu8hsa', '3pvsjbfq4fzvt')
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SYSDATE - SM.SQL_EXEC_START < 1 / 24 / 4
                 AND SM.ELAPSED_TIME / 1000000 >= 300)
                 OR
                 (SM.SQL_ID IN ('b8rz3mkq7yw07')
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SYSDATE - SM.SQL_EXEC_START < 1 / 24 / 4
                 AND SM.ELAPSED_TIME / 1000000 >= 120)
                 )
           )
  LOOP
      BEGIN

           begin
                   SELECT status INTO l_status
                    FROM v$session
                     WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;
                     exception
                     --  SID no longer found
                      when NO_DATA_FOUND then
                        raise_application_error(-20001, 'SID: ' || l_c.SID || ' no longer found after cancelling');
                end;

           IF l_status = 'ACTIVE' then
             DBMS_SYSTEM.set_ev (l_c.SID,l_c.SESSION_SERIAL#,10237,1,'');
           ELSE
             EXIT;
           END IF;

         FOR i IN 1..10 LOOP
              begin
                   SELECT status INTO l_status
                    FROM v$session
                     WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;
                     exception
                     --  SID no longer found
                      when NO_DATA_FOUND then
                        raise_application_error(-20001, 'SID: ' || l_c.SID || ' no longer found after cancelling');
                end;

            -- Status no longer active
            -- then set event level to 0 to avoid further cancels
            if l_status != 'ACTIVE' then
              SYS.DBMS_SYSTEM.set_ev (l_c.SID,l_c.SESSION_SERIAL#,10237,0,'');
            exit;
            end if;

         dbms_lock.sleep(0.05);
         END LOOP;

      END;
   END LOOP;
END;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]