10
 
23/01/2020

Función que muestra un progreso de las consultas con PLSQL de Oracle

Función que muestra un progreso de las consultas con PLSQL de OracleSe crea una función que permite mostrar o imprimir de manera básica un porcentaje de progreso relacionado con una consulta amplia de la información de la base de datos en Oracle.

Como si se tratase de una barra de progreso, esta función creada en PLSQL de Oracle muestra un número de porcentaje conforme se lee una porción de los datos o se consulta una cantidad de registros hasta completar la transacción.

En esta oportunidad traigo algunas sentencias para visualizar de una manera básica cómo podemos trabajar con una barra de progreso desde PLSQL, pero que de igual manera podría servir si se trabaja por ejemplo con Form Builder u otra aplicación de interfaz para el usuario conectado a nuestra base de datos.

La función es ideal para consultar grandes grupos de datos mediante un cursor de lectura.

Creando la función F_PROGRESS_QUERY

El subproceso requiere de tres valor mínimos para su correcto funcionamiento, los cuales son:

  • p_total_rows - hace referencia al total de registros que contiene la consulta
  • p_rownum - es el número de registro leído
  • p_portion - indica la porción de registros leídos para ofrecer el porcentaje

Si la función produce un error ésta arrojará un valor cero (0).
CREATE OR REPLACE FUNCTION F_PROGRESS_QUERY (p_total_rows IN NUMBER,
p_rownum IN NUMBER,
p_portion IN NUMBER DEFAULT 12)
RETURN VARCHAR2
IS
v_i NUMBER := p_rownum;
v_prc NUMBER := 0;
v_mod NUMBER := 0;
v_return VARCHAR2 (10) := NULL;
BEGIN
IF p_total_rows > 0 AND p_portion > 0
THEN
v_mod := p_portion;
IF MOD (v_i, v_mod) = 0 AND (v_i < p_total_rows OR v_i = p_total_rows)
THEN
v_prc := ROUND (v_i*100/p_total_rows);
v_return := v_prc || '%';
ELSE
IF v_i = 1
THEN
v_return := 1 || '%';
ELSIF v_i = p_total_rows
THEN
v_return := 100 || '%';
END IF;
END IF;
ELSE
v_return := 0;
END IF;
RETURN v_return;
EXCEPTION
WHEN OTHERS
THEN
RETURN 0;
END F_PROGRESS_QUERY;
/
Function created.

Ejecutar la función en un bloque anónimo

Para probar nuestra función he tomado los datos de la tabla employees del esquema hr.

DECLARE
v_result VARCHAR2 (30) := '';
v_total_emp NUMBER := 0;
v_i NUMBER := 0;
CURSOR cur_emp
IS
SELECT
employee_id,
first_name,
last_name,
salary
FROM hr.employees;
BEGIN
SELECT COUNT(*)
INTO v_total_emp
FROM hr.employees;
FOR rec IN cur_emp
LOOP
v_i := v_i + 1;
v_result := F_PROGRESS_QUERY (v_total_emp, v_i, 7);
DBMS_OUTPUT.PUT_LINE (v_result);
END LOOP;
END;
Statement processed.
1%
7%
13%
20%
26%
33%
39%
46%
52%
59%
65%
72%
79%
85%
92%
98%
100%

Si te ha servido de ayuda este código, entonces recuerda apoyar ésta y otras publicaciones relacionadas realizando una donación (Bitcoin) o mediante PayPal.

También puede verificar el resultado de esta explicación a través de Live SQL de Oracle.
Consulta Lo+ Top de Base De Datos
Todos los titulares en un solo lugar...