Cómo: destruir sesiones personalizadas en Oracle

No hace mucho empezamos a escribir autoevaluaciones para probar nuestro nuevo producto:
Comparación de datos de dbForge para Oracle. Para recrear el esquema en Oracle, se deben eliminar todas las sesiones de usuario.

Para lograr esto, escribimos el siguiente script PL/SQL:

DECLARE
    PROCEDURE KILL_ALL_USER_SESSION_DBMS_SQL(P_USERNAME_SESSION IN VARCHAR2 := '')
    IS
    V_CURSOR_NAME_SESSION NUMBER := DBMS_SQL.OPEN_CURSOR;
    V_STMT_SESSION VARCHAR2(500) := 'SELECT SID AS SID, SERIAL# AS SERIAL
        FROM V$SESSION
        WHERE USERNAME IS NOT NULL AND USERNAME = '||''''||P_USERNAME_SESSION||'''';
    V_EXEC_SESSION NUMBER;
    V_SID_SESSION NUMBER;
    V_SERIAL_SESSION NUMBER;
    V_CURSOR_NAME_SESSION_KILL NUMBER;
    V_STMT_SESSION_KILL VARCHAR2(500);
    V_EXEC_SESSION_KILL NUMBER;
    BEGIN
        DBMS_SQL.PARSE(V_CURSOR_NAME_SESSION, V_STMT_SESSION, DBMS_SQL.NATIVE);
        V_EXEC_SESSION := DBMS_SQL.EXECUTE(V_CURSOR_NAME_SESSION);
        DBMS_SQL.DEFINE_COLUMN(V_CURSOR_NAME_SESSION,1,V_SID_SESSION);
        DBMS_SQL.DEFINE_COLUMN(V_CURSOR_NAME_SESSION,2,V_SERIAL_SESSION);
        LOOP
            EXIT WHEN DBMS_SQL.FETCH_ROWS(V_CURSOR_NAME_SESSION) = 0;
            DBMS_SQL.COLUMN_VALUE(V_CURSOR_NAME_SESSION,1,V_SID_SESSION);
            DBMS_SQL.COLUMN_VALUE(V_CURSOR_NAME_SESSION,2,V_SERIAL_SESSION);
            V_STMT_SESSION_KILL := 'ALTER SYSTEM KILL SESSION '''
                ||V_SID_SESSION||','||V_SERIAL_SESSION||'''';
            V_CURSOR_NAME_SESSION_KILL := DBMS_SQL.OPEN_CURSOR;
            DBMS_SQL.PARSE(V_CURSOR_NAME_SESSION_KILL, V_STMT_SESSION_KILL, DBMS_SQL.NATIVE);
            V_EXEC_SESSION_KILL := DBMS_SQL.EXECUTE(V_CURSOR_NAME_SESSION_KILL);
            DBMS_SQL.CLOSE_CURSOR(V_CURSOR_NAME_SESSION_KILL);
        END LOOP;
        DBMS_SQL.CLOSE_CURSOR(V_CURSOR_NAME_SESSION);
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_SQL.CLOSE_CURSOR(V_CURSOR_NAME_SESSION_KILL);
        DBMS_SQL.CLOSE_CURSOR(V_CURSOR_NAME_SESSION);
    END;
BEGIN
    KILL_ALL_USER_SESSION_DBMS_SQL('SCOTT');
    -- specify additional calls if necessary
END;

Esta unidad utiliza el paquete DBMS_SQL integrado para seleccionar datos relacionados con las sesiones de un usuario y crear consultas dinámicas ALTER SYSTEM KILL SESSION para cada sesión de usuario.

Vamos a crear dos conexiones conectando SYSTEM y SCOTT. Ejecutemos una consulta usando la conexión SCOTT y usemos la conexión SYSTEM para abrir el administrador de sesión de OraDeveloper Studio:

OraDeveloper Studio: sesiones activas

OraDeveloper Studio: sesiones activas

Como puede ver en la imagen de arriba, SCOTT ha creado tres sesiones, una de las cuales está activa. Vamos a crear un documento SQL vacío usando una conexión SYSTEM y ejecutar el script.

OraDeveloper Studio: realizar el procedimiento

OraDeveloper Studio: realizar el procedimiento

Ahora actualicemos las sesiones de SCOTT en la ventana Administrador de sesiones:

OraDeveloper Studio: Sesiones eliminadas

OraDeveloper Studio: Sesiones eliminadas

Como puede ver en la imagen de arriba, todas las sesiones de SCOTT ahora tienen un estado KILL, y eso es lo que queríamos lograr.

Artículos de interés

Subir