Uma das novas features introduzidas na versão 18c do Oracle database é o ALTER SYSTEM CANCEL SQL que permite que uma instrução SQL em execução em determinada sessão seja manualmente cancelada sem que a sessão seja desconectada, o que ocorre na utilização das instruções ALTER SYSTEM KILL SESSION / DISCONNECT SESSION.
A utilização do “CANCEL SQL” é útil quando determinada sessão está executando alguma instrução ofensora e é necessário liberação de recursos ou mesmo quando instruções SQL são executadas incorretamente.
Sempre que uma instrução SQL é cancelada, ocorre o rollback dos dados alterados pela mesma.
Sintaxe do comando:
ALTER SYSTEM CANCEL SQL
'SID, SERIAL#, [@INST_ID, SQL_ID]';
Caso o SQL_ID não seja especificado (opcional), a instrução SQL atualmente em execução na sessão especificada será cancelada.
-- Cancelar SQL em execução
em determinada sessão da instance conectada.
SQL> ALTER SYSTEM
CANCEL SQL '38, 41388';
-- Cancelar SQL em
execução na sessão com INST_ID = 1.
SQL> ALTER SYSTEM
CANCEL SQL '38, 41388, @1';
-- Cancelar SQL
específico em determinada sessão da instance conectada.
SQL> ALTER SYSTEM CANCEL SQL '38, 41388, 3tfmdd4xagv3y';
-- Cancelar SQL
específico na sessão com INST_ID = 1.
SQL> ALTER SYSTEM CANCEL SQL '38, 41388, @1, 3tfmdd4xagv3y';
|
Exemplo:
Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.1.0.0.0 SQL> select distinct sid from v$mystat; SID ---------- 38 SQL> begin 2 loop null; 3 end loop; 4 end; 5 /
Em uma nova
sessão, capture as informações necessárias e execute o ALTER SYSTEM CANCEL SQL:
SQL> set lines 200 SQL> select inst_id, serial#, sql_id, status, (select sql_fulltext from v$sql sq where sq.sql_id=se.sql_id) sql_fulltext from gv$session se where sid=38; INST_ID SERIAL# SQL_ID STATUS SQL_FULLTEXT ---------- ---------- ------------- -------- ------------------------------ 1 41388 3tfmdd4xagv3y ACTIVE begin loop null; end loop; end; SQL> ALTER SYSTEM CANCEL SQL '38, 41388, @1, 3tfmdd4xagv3y'; System altered.
SQL> begin 2 loop null; 3 end loop; 4 end; 5 / begin * ERROR at line 1: ORA-01013: user requested cancel of current operation
SQL> select distinct sid from v$mystat; SID ---------- 38
Referência:
https://docs.oracle.com/en/database/oracle/oracle-database/18/newft/new-features.html#GUID-EFC832BE-DC2C-4997-8C38-8A9E27A4FFC4
O mais legal é que funciona perfeitamente no 12.2. No 12.1 não. Ou seja, entrou como uma feature não documentada no 12.2 e como documentada na 18c.
ResponderExcluirComo é um comando muito específico, muito atômico, não vejo nenhum problema em ser usado em um 12.2, se for uma alterativa melhor que um disconnect session.