
Progress Bar en Oracle Apex
Un progress bar es esencial cuando lanzamos procesos que van a tardar mucho tiempo como procesos batch, en este post vamos a usar una vista llamada V$SESSION_LONGOPS, dicha vista se encarga de registrar los procesos que duran más de 6 segundos, entonces seguramente lo podremos encontrar en esta vista el proceso que lanzaremos y entonces podremos aplicar las siguientes operaciones: backup, estadisticas, ejecución de consultas y otras más.
¿De que me sirve saber esto?
Bueno, los progress bar nos sirven para indicar a los usuarios finales el estatus de un proceso que va a tardar ¡¡muchoooo!!, en lo personal he desarrollado procesos que duran hasta 6 horas, y bueno; el usuario siempre se pregunta, ¿esto está funcionando?.
Lo primero que debes hacer es crear estos dos procedures do_init y do_update
do_init: este procedure se encarga de mandar a la v$session_longops el registro de la operación, y solo eso, podrás encontrar más información en esta liga https://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS65225.
do_update: dentro de un ciclo for, reportaremos a la v$session_longops el estatus de la operación, para así poder ir calculando el % de avance de nuestro proceso.
¿Qué puedo registrar en la v$session_longops?
Puedes registrar lo que tu quieras: segundos, particiones, filas procesadas, objetos, etc, etc.. en el ejemplo vamos a procesar segundos, 300 segundos en total, nuestro procedure de prueba solo sirve de ejemplo para hacer el progress bar.
Explicación en vídeo del progress bar en apex
create or replace procedure do_longrun as begin apex_util.set_workspace ( p_workspace => 'UDEMY' ); pkg_session_longops.do_init('DO_LONGRUN', 300, 'seconds'); for i in 1..30 loop apex_util.pause(10); pkg_session_longops.do_update('DO_LONGRUN', (i * 10)); end loop; end;
create or replace package pkg_session_longops is procedure do_init (p_opname in varchar2, p_target in number, p_units in varchar2); procedure do_update (p_opname in varchar2, p_status in number); end pkg_session_longops; / create or replace package body pkg_session_longops is type t_array is table of number index by varchar2(255); g_arr_rindex t_array; g_arr_slno t_array; g_arr_total t_array; procedure do_init (p_opname in varchar2, p_target in number, p_units in varchar2) is l_rindex binary_integer := dbms_application_info.set_session_longops_nohint; l_slno binary_integer; begin dbms_application_info.set_session_longops( rindex => l_rindex, slno => l_slno, op_name => p_opname, target => 0, context => 0, sofar => 0, totalwork => p_target, target_desc => 'no target', units => p_units ); g_arr_rindex(p_opname) := l_rindex; g_arr_slno(p_opname) := l_slno; g_arr_total(p_opname) := p_target; end do_init; procedure do_update (p_opname in varchar2, p_status in number) is l_rindex binary_integer := g_arr_rindex(p_opname); l_slno binary_integer := g_arr_slno(p_opname); begin dbms_application_info.set_session_longops( rindex => l_rindex, slno => l_slno, op_name => p_opname, target => 0, context => 0, sofar => p_status, totalwork => g_arr_total(p_opname), target_desc => 'no target', units => null ); g_arr_rindex(p_opname) := l_rindex; g_arr_slno(p_opname) := l_slno; end do_update; end pkg_session_longops; /
Descarga la app
Ligas de interés
https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2092.htm#REFRN30227
Post sugerido:
JS, AJAX, PROMESAS + PLSQL en APEX
Curso gratis de Oracle Apex en Español
Por favor si te sirvió el vídeo, invítame un café dando clic a los anuncios, me ayuda muchísimo para no dormir y poder hacer más posts
Como estas estimado?
Esta muy bueno el progres bar y es genial tenerlo en cuenta a la hora de iniciar un Sistema o adaptar los que ya se tienen.
Tengo un problema al ejecutar el código que dejaste:
PL/SQL: El procedimiento do_update en lugar de actualizar el registro INSERTA UNO NUEVO. He revisado y revisado y no consigo que a una instancia del programa solo tena un registro.
He bajado la VM de Oracle 23c Free que trae todo el Apex 22.2 ya incluido. Yo lo actualice a la 23.1
Aplicación Web: El Refresh no se ejecuta automáticamente. Por alguna razón pero el botón si funciona. Al ejecutarlo en lugar de traerme solo una fila como en tu demo, me trae varios registros por cada iteración del loop.
Espero que puedas darme una mano con esto por favor.
Desde ya muchas gracias!!