PL- SQL - Как добавить исключение для этого l oop? - PullRequest
0 голосов
/ 13 июля 2020

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

set serveroutput on;
begin
for rec in (SELECT se.sid,se.serial#,se.inst_id FROM gv$session se where type <> 'BACKGROUND' and username not in ('SYSRAC','SYS') and sid <> (select sys_context('userenv','sid') from dual) and status <> 'KILLED') 
loop
  execute immediate 'Alter System Kill Session '''|| rec.Sid|| ',' || rec.Serial# || ',@' ||rec.inst_id||''' IMMEDIATE';
  dbms_output.put_line('Eliminada: '||rec.sid);
end loop;
end;
/

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

ERROR at line 1:
ORA-00030: User session ID does not exist.
ORA-06512: at line 4
ORA-06512: at line 4

Как я могу управлять l oop, чтобы игнорировать сеансы, которые отключаются от базы данных для себя?

1 Ответ

1 голос
/ 13 июля 2020

Я бы сделал это:

set serveroutput on;
declare
sess_not_exist exception;
pragma exception_init(sess_not_exist, -30);
begin
for rec in (SELECT se.sid,se.serial#,se.inst_id FROM gv$session se where type <> 'BACKGROUND' and username not in ('SYSRAC','SYS') 
            and sid <> (select sys_context('userenv','sid') from dual) and status <> 'KILLED') 
loop
  begin
    execute immediate 'Alter System Kill Session '''|| rec.Sid|| ',' || rec.Serial# || ',@' ||rec.inst_id||''' IMMEDIATE';
    dbms_output.put_line('Eliminada: '||rec.sid);
    exception 
    when sess_not_exist then null;
    when others then raise;
  end;
end loop;
end;
/

Причины:

  1. если сеанс между курсором и выполнением больше не существует, вы не должны выдавать ошибку
  2. вы должны инкапсулировать модуль, который запускает выполнение немедленно, чтобы обработать исключение в любой записи в l oop, следовательно, секция конца двойного начала.

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

...