Un único SQL_ID de Oracle Database puede contener múltiples sesiones. En caso de querer matar con alter system kill session
cada una de las sesiones no es necesario ir una a una a partir del SID, SERIAL de cada una de ellas.
A través de la siguiente query podemos generar un listado de todas las sesiones de un SQL_ID y ejecutarlas en bloque:
SELECT 'alter system kill session ' || '''' || SID || ',' || SERIAL# || ',@' || inst_id || '''' || ' immediate ;' FROM gv$session WHERE sql_id = '&sql_id'
La cláusula WHERE especifica que el SQL_ID será el que especifiquemos por STDIN al ejecutar la query. inst_id
es el identificador del nodo del RAC en el que se está ejecutando la sesión. El resultado será el listado de todos los alter system kill session
que se deben ejecutar.
Si no se trata de un RAC, quitad esa parte:
SELECT 'alter system kill session ' || '''' || SID || ',' || SERIAL# || ' immediate ;' FROM v$session WHERE sql_id = '&sql_id';
Y si queréis especificar directamente el SQL_ID:
SELECT 'alter system kill session ' || '''' || SID || ',' || SERIAL# || ' immediate ;' FROM v$session WHERE sql_id = 'dsazjnz378c00';