progress bar

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

Progress Bar App

Ligas de interés

https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2092.htm#REFRN30227

Post sugerido:

Sweet Alert2 JS Oracle APEX

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 😎

Tags:

1 comment on “Progress Bar en Oracle Apex

  1. 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!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.