domingo, 29 de enero de 2017

Probar stored procedure de Oracle con cursor de salida en SQL Developer

Cómo probar stored procedure de Oracle con cursor de salida en SQL Developer.

Estuve buscando encontrar un problema de performance relacionado con el tiempo de respuesta de una aplicación en el momento de hacer login.

Dado que la aplicación es externa sólo puedo verificar del lado de la base de datos.

Para esto decidí verificar el tiempo de respuesta del stored procedure que realiza el login a la aplicación y para esto me vi en la necesidad de llamar al stored procedure directo desde SQL Developer y ver el tiempo de respuesta.

El stored procedure tiene un parámetro de salida de tipo cursor en el que devuelve los datos del usuario registrado que está intentando acceder.

Un punto importante es que el cursor el stored procedure es dinámico por lo que devuelve el resultado de un query variable. Por lo tanto no puedo usar el tipo de registro de una tabla existente (Tabla%ROWTYPE)

La clave aquí es definir el tipo de registro que devuelve el cursor dinámico. Campo por campo deben definir el nombre y tipo tal cual el cursor devuelve. Si les falta o sobra alguno, no va a jalar.

Aquí abajo en negritas la variable registro es definida como IS RECORD y cada campo definido uno por uno para poder hacer el FETCH con el cursor sin que haya problemas.

Les dejo la firma del stored:

PROCEDURE MI_STORED (p_status OUT NUMBER,pocResultado OUT PKG_MI_PAQUETE.defcursor, p_email IN VARCHAR2,p_password IN VARCHAR2)

SQL para probarlo:

SET serveroutput ON;
DECLARE
v_status NUMBER;
v_resultado sys_refcursor;
TYPE registro IS RECORD (ID NUMBER,NOMBRE VARCHAR(60));
v_registro registro;

v_email VARCHAR2(60);
v_password VARCHAR2(30);
BEGIN
v_email:='correo@correo.com';
v_password:='micontrasena';
PKG_MI_PAQUETE.MI_STORED(v_status, v_resultado, v_email, v_password);
LOOP
FETCH v_resultado INTO v_registro;
EXIT WHEN v_resultado%notfound;
dbms_output.put_line('ID   –>' || v_registro.ID);
dbms_output.put_line('Nombre –>' || v_registro.NOMBRE);
END LOOP;
END;


Espero les sirva.

No hay comentarios.:

Publicar un comentario